Menambahkan string yang sama ke daftar string dengan Python

183

Saya mencoba untuk mengambil satu string, dan menambahkannya ke setiap string yang terkandung dalam daftar, dan kemudian memiliki daftar baru dengan string yang sudah selesai. Contoh:

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

*magic*

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

Saya mencoba untuk loop, dan upaya pemahaman daftar, tapi itu sampah. Seperti biasa, bantuan apa pun, sangat kami hargai.

Kevin
sumber
25
Tidak bijaksana untuk menetapkan listkarena itu builtin.
Noufal Ibrahim

Jawaban:

315

Cara paling sederhana untuk melakukan ini adalah dengan pemahaman daftar:

[s + mystring for s in mylist]

Perhatikan bahwa saya menghindari menggunakan nama builtin seperti listkarena itu membayangi atau menyembunyikan nama builtin, yang sangat tidak baik.

Juga, jika Anda tidak benar-benar membutuhkan daftar, tetapi hanya membutuhkan iterator, ekspresi generator bisa lebih efisien (walaupun sepertinya tidak penting pada daftar pendek):

(s + mystring for s in mylist)

Ini sangat kuat, fleksibel, dan ringkas. Setiap programmer python yang baik harus belajar menggunakannya.

gahooa
sumber
8
Atau genexp jika Anda menginginkannya dengan malas(s + mystring for s in mylist)
Noufal Ibrahim
Itu pasti berhasil, terima kasih banyak, masih membungkus kepala saya di sekitar pemahaman daftar, jika Anda tahu tutorial yang baik tentang itu. sebelum setiap item dalam daftar, ada u ', apakah itu untuk unicode?
Kevin
3
@Kevin, inilah tutorial untuk string unicode, docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray
Jika Anda memerlukan indeks dari daftar yang dapat Anda lakukan["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus
1
Sesuatu yang perlu diperhatikan: Jika Anda menambahkan "mystring" sebelum "s", daripada sesudahnya, itu akan menyatukan "mystring" di awal "s". like so 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

Ini akan mencetak:

['foobar', 'fobbar', 'fazbar', 'funkbar']
Tendayi Mawushe
sumber
5

map Sepertinya alat yang tepat untuk pekerjaan itu bagiku.

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

Lihat bagian ini pada alat pemrograman fungsional untuk lebih banyak contoh map.

DMan
sumber
2

Menjalankan percobaan berikut dengan cara pythonic:

[s + mystring for s in mylist]

tampaknya ~ 35% lebih cepat daripada penggunaan loop for seperti ini:

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

Percobaan

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)

Hasil

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
pengecut
sumber
2

Memperluas sedikit ke "Menambahkan daftar string ke daftar string":

    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)

Hasil:

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

tipe file dapat dikonversi lebih lanjut str

Artur Sokolovsky
sumber
Pembaruan: Anda dapat menghindari penyalinan simbol yang sama beberapa kali: at = np.full(fill_value='@',shape=1,dtype=object) atau cukup: at = np.array("@", dtype=object)
Artur Sokolovsky
1

Anda dapat menggunakan lambda inside map dengan python. menulis generator kode abu-abu. https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # kode Anda ada di sini '' 'kode n-1 bit, dengan 0 diawali dengan setiap kata, diikuti oleh kode n-1 bit dalam urutan terbalik, dengan 1 ditambahkan pada setiap kata. ''

    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))
Rohit Malgaonkar
sumber
1

Memperbarui dengan lebih banyak opsi

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

Hindari menggunakan kata kunci sebagai variabel seperti 'daftar', ganti namanya 'daftar' sebagai 'list1'

Uday Kiran
sumber
Ini saran yang bagus. Yang lain adalah menggunakan array_map dengan fungsi yang menambahkan string ... php.net/manual/en/function.array-map.php
ROunofF
1

Inilah jawaban sederhana menggunakan pandas.

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

list2 = (pd.Series(list1) + string).tolist()
list2
# ['foobar', 'fobbar', 'fazbar', 'funkbar']
Keiku
sumber
silakan ubah nama variabel dari daftar dan string menjadi yang lain. daftar adalah tipe python builtin
sagi
0
list2 = ['%sbar' % (x,) for x in list]

Dan jangan gunakan listsebagai nama; itu membayangi tipe bawaan.

Ignacio Vazquez-Abrams
sumber
Kenapa '%sbar' % (x,)bukannya '%sbar' % x? Mengapa tidak x + 'bar'?
John Machin
1
Yang kedua akan gagal jika x adalah tuple. Jelas Anda berencana membuat setiap elemen menjadi string, tetapi terkadang ada yang salah. Perbedaan antara yang pertama dan yang ketiga sebagian besar adalah rasa, kecuali jika Anda mendapatkan string dari sumber eksternal.
Ignacio Vazquez-Abrams
2
'naikkan pengecualian'! = 'gagal'. Jika Anda memiliki tipe data yang salah, Anda sudah gagal. Ekspresi pilihan saya memunculkan pengecualian yang menyoroti kegagalan; ekspresi pilihan Anda secara diam-diam menghasilkan sampah. Taste: ekspresi lambat baroque tidak sesuai dengan selera saya.
John Machin
0
new_list = [word_in_list + end_string for word_in_list in old_list]

Menggunakan nama seperti "daftar" untuk nama variabel Anda buruk karena akan menimpa / menimpa bawaan.

Nggak
sumber
0

Untuk berjaga-jaga

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
penyamak alam
sumber