Aynı dizeyi Python'daki bir dize listesine ekleme


183

Bir dize almaya çalışıyorum ve bir listede bulunan her dize ekleyin ve sonra tamamlanmış dizeleri ile yeni bir liste var. Misal:

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'

*magic*

list2 = ['foobar', 'fobbar', 'fazbar', 'funkbar']

Döngüler ve liste kavrama girişimi denedim, ama çöp oldu. Her zaman olduğu gibi, herhangi bir yardım, çok takdir etmek.


25
listBir yerleşik olduğu için atamak akıllıca değil.
Noufal Ibrahim

Yanıtlar:


315

Bunu yapmanın en basit yolu bir liste kavramasıdır:

[s + mystring for s in mylist]

Yerleşik isimleri kullanmaktan kaçındığımı fark ettim, listçünkü bu yerleşik isimleri gölgeliyor ya da gizliyor, ki bu çok iyi değil.

Ayrıca, aslında bir listeye ihtiyacınız yoksa, ancak sadece bir yineleyiciye ihtiyacınız varsa, bir jeneratör ifadesi daha verimli olabilir (kısa listelerde büyük olasılıkla olmasa da):

(s + mystring for s in mylist)

Bunlar çok güçlü, esnek ve özlüdür. Her iyi python programcısı onları kullanmayı öğrenmelidir.


8
Veya tembel bir şekilde isterseniz bir genexp(s + mystring for s in mylist)
Noufal Ibrahim

Bu kesinlikle iyi bir öğretici biliyorsanız, hile, çok teşekkür ederim, hala kafamı liste anlama etrafına sararak yaptı. listedeki her öğeden önce bir u 'var, bu unicode için mi?
Kevin

3
@Kevin, İşte unicode dizeleri için bir öğretici, docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray

Listeden dizine ihtiyacınız varsa["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus

1
Dikkat edilmesi gereken bir nokta: "mystring" i "s" den önce değil, sonra eklerseniz "mystring" i "s" nin başında birleştirir. böyle list2 = ["mystring" + s for s in mylist]=list2 = ['barfoo', 'barfob', 'barfaz', 'barfunk']
Paul Tuckett

25
my_list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
my_new_list = [x + string for x in my_list]
print my_new_list

Bu yazdırılacak:

['foobar', 'fobbar', 'fazbar', 'funkbar']

5

map iş için doğru araç gibi görünüyor.

my_list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
list2 = list(map(lambda orig_string: orig_string + string, my_list))

Daha fazla örnek için fonksiyonel programlama araçları hakkındaki bu bölüme bakın map.


2

Aşağıdaki deneyi pitonik bir şekilde çalıştırmak:

[s + mystring for s in mylist]

Bunun gibi bir for döngüsünün bariz kullanımından ~% 35 daha hızlı görünüyor:

i = 0
for s in mylist:
    mylist[i] = s+mystring
    i = i + 1

Deney

import random
import string
import time

mystring = '/test/'

l = []
ref_list = []

for i in xrange( 10**6 ):
    ref_list.append( ''.join(random.choice(string.ascii_lowercase) for i in range(10)) )

for numOfElements in [5, 10, 15 ]:

    l = ref_list*numOfElements
    print 'Number of elements:', len(l)

    l1 = list( l )
    l2 = list( l )

    # Method A
    start_time = time.time()
    l2 = [s + mystring for s in l2]
    stop_time = time.time()
    dt1 = stop_time - start_time
    del l2
    #~ print "Method A: %s seconds" % (dt1)

    # Method B
    start_time = time.time()
    i = 0
    for s in l1:
        l1[i] = s+mystring
        i = i + 1
    stop_time = time.time()
    dt0 = stop_time - start_time
    del l1
    del l
    #~ print "Method B: %s seconds" % (dt0)

    print 'Method A is %.1f%% faster than Method B' % ((1 - dt1/dt0)*100)

Sonuçlar

Number of elements: 5000000
Method A is 38.4% faster than Method B
Number of elements: 10000000
Method A is 33.8% faster than Method B
Number of elements: 15000000
Method A is 35.5% faster than Method B

2

Biraz "Dizelerin listesini dizelerin listesine ekleme" olarak genişletme:

    import numpy as np
    lst1 = ['a','b','c','d','e']
    lst2 = ['1','2','3','4','5']

    at = np.full(fill_value='@',shape=len(lst1),dtype=object) #optional third list
    result = np.array(lst1,dtype=object)+at+np.array(lst2,dtype=object)

Sonuç:

array(['a@1', 'b@2', 'c@3', 'd@4', 'e@5'], dtype=object)

dtype odject daha da dönüştürülebilir str


Güncelleme: Aynı sembolü birden çok kez kopyalamaktan kaçınabilirsiniz: at = np.full(fill_value='@',shape=1,dtype=object) veya basitçe: at = np.array("@", dtype=object)
Artur Sokolovsky

1

haritanın içindeki lambda'yı python'da kullanabilirsiniz. gri kod üreteci yazdı. https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # kodunuz buraya gelir '' 'n-1 bit kodu, her kelimeye 0 eklenir, ardından n-1 bit kodu ters sırayla, her kelimeye 1 tane eklenir. ''

    def graycode(n):
        if n==1:
            return ['0','1']
        else:
            nbit=map(lambda x:'0'+x,graycode(n-1))+map(lambda x:'1'+x,graycode(n-1)[::-1])
            return nbit

    for i in xrange(1,7):
        print map(int,graycode(i))

1

Diğer seçeneklerle güncelleme

list1 = ['foo', 'fob', 'faz', 'funk']
addstring = 'bar'
for index, value in enumerate(list1):
    list1[index] = addstring + value #this will prepend the string
    #list1[index] = value + addstring this will append the string

Anahtar kelimeleri 'list' gibi değişkenler olarak kullanmaktan kaçının, bunun yerine 'list' adını 'list1' olarak değiştirin


Bu iyi bir öneri. Bir diğeri dizi_map
ROunofF

1

İşte basit bir cevap kullanarak pandas.

import pandas as pd
list1 = ['foo', 'fob', 'faz', 'funk']
string = 'bar'

list2 = (pd.Series(list1) + string).tolist()
list2
# ['foobar', 'fobbar', 'fazbar', 'funkbar']

lütfen değişkenleri listeden ve dizeden başka bir adla değiştirin. liste yerleşik bir python türüdür
sagi

0
list2 = ['%sbar' % (x,) for x in list]

Ve listisim olarak kullanmayın ; yerleşik türü gölgelendirir.


Neden '%sbar' % (x,)yerine '%sbar' % x? Neden olmasın x + 'bar'?
John Machin

1
Eğer x bir demet ise ikinci başarısız olur. Açıkçası , her öğenin bir dize olmasını planlıyorsunuz , ancak bazen işler ters gidiyor. Dizeyi harici bir kaynaktan almadığınız sürece, birinci ve üçüncü arasındaki fark çoğunlukla tadıdır.
Ignacio Vazquez-Abrams

2
'özel durum kaldır'! = 'başarısız'. Yanlış veri türüne sahipseniz, zaten başarısız oldunuz . Tercih ettiğim ifade, hatayı vurgulayan bir istisna oluşturur; tercih ettiğiniz ifade sessizce çöp üretir. Tat: Barok yavaş ifadeler benim zevkime göre değil.
John Machin

0
new_list = [word_in_list + end_string for word_in_list in old_list]

Değişken adlarınız için "liste" gibi adlar kullanmak, yerleşiklerin üzerine yazacağı / geçersiz kılacağı için kötüdür.


0

Her ihtimale karşı

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.