Nối cùng một chuỗi vào danh sách các chuỗi trong Python


183

Tôi đang cố gắng lấy một chuỗi và nối nó vào mỗi chuỗi có trong danh sách, và sau đó có một danh sách mới với các chuỗi đã hoàn thành. Thí dụ:

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

*magic*

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

Tôi đã cố gắng cho các vòng lặp, và một nỗ lực để hiểu danh sách, nhưng đó là rác. Như mọi khi, bất kỳ trợ giúp, nhiều đánh giá cao.


25
Nó không khôn ngoan để gán cho listvì nó là một nội dung.
Noufal Ibrahim

Câu trả lời:


315

Cách đơn giản nhất để làm điều này là với một sự hiểu biết danh sách:

[s + mystring for s in mylist]

Lưu ý rằng tôi đã tránh sử dụng các tên dựng sẵn như vậy listvì bóng đó hoặc ẩn các tên dựng sẵn, điều này rất không tốt.

Ngoài ra, nếu bạn không thực sự cần một danh sách, nhưng chỉ cần một trình vòng lặp, một biểu thức trình tạo có thể hiệu quả hơn (mặc dù điều đó không quan trọng trong các danh sách ngắn):

(s + mystring for s in mylist)

Đây là rất mạnh mẽ, linh hoạt, và súc tích. Mỗi lập trình viên trăn giỏi nên học cách sử dụng chúng.


8
Hoặc một bản khai thác nếu bạn muốn nó một cách uể oải(s + mystring for s in mylist)
Noufal Ibrahim

Điều đó chắc chắn đã làm được mẹo, cảm ơn rất nhiều, vẫn quấn đầu tôi xung quanh việc hiểu danh sách, nếu bạn biết một hướng dẫn tốt về nó. trước mỗi mục trong danh sách, có một u ', đó có phải là unicode không?
Kevin

3
@Kevin, đây là một hướng dẫn cho các chuỗi unicode, docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray

Nếu bạn cần chỉ mục từ danh sách bạn có thể làm["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus 11/03/19

1
Một vài điều cần lưu ý: Nếu bạn thêm "bí ẩn" vào trước "s", thay vì sau đó, nó sẽ ghép nối "bí ẩn" ở đầu "s". như vậy 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

Điều này sẽ in:

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

5

map có vẻ như công cụ phù hợp với công việc với tôi

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

Xem phần này trên các công cụ lập trình chức năng để biết thêm ví dụ về map.


2

Chạy thử nghiệm sau theo cách pythonic:

[s + mystring for s in mylist]

dường như nhanh hơn ~ 35% so với việc sử dụng vòng lặp for như thế này:

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

Thí nghiệm

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)

Các kết quả

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

Mở rộng một chút thành "Nối một danh sách các chuỗi vào danh sách các chuỗi":

    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)

Kết quả:

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

dtype odject có thể được chuyển đổi thêm str


Cập nhật: Bạn có thể tránh sao chép cùng một biểu tượng nhiều lần: at = np.full(fill_value='@',shape=1,dtype=object) hoặc đơn giản: at = np.array("@", dtype=object)
Artur Sokolovsky

1

bạn có thể sử dụng lambda bên trong bản đồ trong python. đã viết một trình tạo mã màu xám. https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # mã của bạn ở đây '' 'mã n-1, với 0 được thêm vào mỗi từ, theo sau là mã n-1 bit theo thứ tự ngược lại, với 1 được thêm vào mỗi từ. '' '

    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

Cập nhật với nhiều tùy chọn hơn

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

Tránh sử dụng từ khóa làm biến như 'danh sách', đổi tên thành 'danh sách' thành 'list1'


Đây là một gợi ý tốt. Một số khác sẽ được sử dụng array_map với một chức năng mà gắn thêm chuỗi ... php.net/manual/en/function.array-map.php
ROunofF

1

Đây là một câu trả lời đơn giản bằng cách sử dụng pandas.

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

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

vui lòng thay đổi tên của các biến từ danh sách và chuỗi thành một thứ khác. danh sách là một loại trăn dựng sẵn
sagi

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

Và đừng dùng listlàm tên; nó làm mờ kiểu tích hợp.


Tại sao '%sbar' % (x,)thay vì '%sbar' % x? Tại sao không x + 'bar'?
John Machin

1
Lần thứ hai sẽ thất bại nếu x xảy ra là một tuple. Rõ ràng bạn có kế hoạch để mọi yếu tố là một chuỗi, nhưng đôi khi mọi thứ đi sai. Sự khác biệt giữa thứ nhất và thứ ba chủ yếu là hương vị, trừ khi bạn có được chuỗi từ nguồn bên ngoài.
Ignacio Vazquez-Abrams

2
'tăng ngoại lệ'! = 'thất bại'. Nếu bạn có kiểu dữ liệu sai, bạn đã thất bại. Biểu hiện ưa thích của tôi làm tăng một ngoại lệ làm nổi bật sự thất bại; biểu hiện ưa thích của bạn âm thầm tạo ra rác. Hương vị: biểu hiện chậm baroque không phải là sở thích của tôi.
John Machin

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

Sử dụng các tên như "danh sách" cho tên biến của bạn là xấu vì nó sẽ ghi đè / ghi đè lên các nội dung.


0

Chỉ trong trường hợp

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.