ต่อท้ายสตริงเดียวกันกับรายการสตริงใน Python


183

ฉันพยายามที่จะใช้หนึ่งสายและผนวกกับทุกสายที่มีอยู่ในรายการแล้วมีรายการใหม่ที่มีสายสมบูรณ์ ตัวอย่าง:

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

*magic*

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

ฉันพยายามลูปและพยายามเข้าใจรายการ แต่มันเป็นขยะ เช่นเคยความช่วยเหลือใด ๆ ชื่นชมมาก


25
มันไม่ฉลาดที่จะกำหนดให้listเพราะมันเป็นแบบ builtin
Noufal Ibrahim

คำตอบ:


315

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการเข้าใจรายการ:

[s + mystring for s in mylist]

โปรดสังเกตว่าฉันหลีกเลี่ยงการใช้ชื่อบิวอินเช่นlistเนื่องจากเงาหรือซ่อนชื่อบิลด์อินซึ่งไม่ดีมาก

นอกจากนี้หากคุณไม่ต้องการรายการ แต่เพียงต้องการตัววนซ้ำนิพจน์ตัวสร้างอาจมีประสิทธิภาพมากกว่า (แม้ว่าจะไม่เป็นไปตามรายการสั้น ๆ ):

(s + mystring for s in mylist)

สิ่งเหล่านี้มีประสิทธิภาพยืดหยุ่นและรัดกุม โปรแกรมเมอร์ไพ ธ อนที่ดีทุกคนควรเรียนรู้ที่จะควงมัน


8
หรือ genexp ถ้าคุณต้องการมัน(s + mystring for s in mylist)
ขี้เกียจ

นั่นเป็นเคล็ดลับที่ทำขอบคุณมากยังคงห่อหัวของฉันรอบรายการความเข้าใจถ้าคุณรู้ดีเกี่ยวกับการสอนเกี่ยวกับเรื่องนี้ ก่อนรายการแต่ละรายการในรายการมีตัว u 'นั่นเป็น unicode หรือไม่
Kevin

3
@Kevin ต่อไปนี้เป็นบทเรียนสำหรับสตริง Unicode, docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray

หากคุณต้องการดัชนีจากรายการคุณสามารถทำได้["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus

1
สิ่งที่ควรทราบ: หากคุณเพิ่ม "mystring" ไว้ข้างหน้า "s" แทนที่จะเป็น "mystring" จะเชื่อมต่อ "mystring" ที่จุดเริ่มต้นของ "s" like ดังนั้น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

สิ่งนี้จะพิมพ์:

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

5

map ดูเหมือนจะเป็นเครื่องมือที่เหมาะสมสำหรับงานของฉัน

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

ดูส่วนนี้mapในเครื่องมือการเขียนโปรแกรมการทำงานสำหรับตัวอย่างเพิ่มเติมของ


2

ใช้การทดลองต่อไปนี้ตามวิธี pythonic:

[s + mystring for s in mylist]

ดูเหมือนว่าจะเร็วกว่าการใช้ลูปลูปประมาณ 35% เช่นนี้:

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

การทดลอง

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)

ผล

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

ขยายบิตไปที่ "การผนวกรายการสตริงเข้ากับรายการสตริง":

    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)

ผลลัพธ์:

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

odty ของ dtype อาจเปลี่ยนเป็น str


อัปเดต: คุณสามารถหลีกเลี่ยงการคัดลอกสัญลักษณ์เดียวกันหลายครั้ง: at = np.full(fill_value='@',shape=1,dtype=object) หรือเพียงแค่: at = np.array("@", dtype=object)
Artur Sokolovsky

1

คุณสามารถใช้แลมบ์ดาภายในแผนที่ในหลาม เขียนกำเนิดรหัสสีเทา https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # โค้ดของคุณไปที่นี่ '' รหัส n-1 บิตโดยมี 0 ต่อท้ายแต่ละคำตามด้วย รหัส n-1 บิตในลำดับย้อนกลับโดยที่ 1 ได้เติมแต่ละคำ '''

    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

อัปเดตด้วยตัวเลือกเพิ่มเติม

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

หลีกเลี่ยงการใช้คำหลักเป็นตัวแปรเช่น 'list' เปลี่ยนชื่อ 'list' เป็น 'list1' แทน


นี่เป็นคำแนะนำที่ดี อีกอันหนึ่งก็คือการใช้ array_map กับฟังก์ชั่นที่ต่อท้ายสตริง ... php.net/manual/en/function.array-map.php
ROunofF

1

pandasนี่คือคำตอบง่ายๆโดยใช้

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

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

โปรดเปลี่ยนชื่อของตัวแปรจากรายการและสตริงเป็นอย่างอื่น รายการเป็นประเภทหลาม builtin
sagi

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

และห้ามใช้listเป็นชื่อ มันเงาประเภทในตัว


ทำไม'%sbar' % (x,)แทน'%sbar' % x? ทำไมx + 'bar'ล่ะ
John Machin

1
วินาทีจะล้มเหลวถ้า x เป็นทูเปิล เห็นได้ชัดว่าคุณวางแผนที่จะให้ทุกองค์ประกอบเป็นสตริง แต่บางครั้งสิ่งผิดปกติ ความแตกต่างระหว่างตัวแรกและตัวที่สามนั้นส่วนใหญ่จะมีรสชาติยกเว้นว่าคุณได้รับสายจากแหล่งภายนอก
Ignacio Vazquez-Abrams

2
'เพิ่มข้อยกเว้น'! = 'ล้มเหลว' หากคุณมีชนิดข้อมูลที่ไม่ถูกต้องแสดงว่าคุณล้มเหลวแล้ว นิพจน์ที่ฉันต้องการทำให้เกิดข้อยกเว้นที่เน้นความล้มเหลว การแสดงออกที่คุณต้องการสร้างขยะอย่างเงียบ ๆ Taste: การแสดงออกที่ช้าตามแบบบะโรคไม่ได้เป็นไปตามรสนิยมของฉัน
John Machin

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

การใช้ชื่อเช่น "list" สำหรับชื่อตัวแปรของคุณนั้นไม่ดีเนื่องจากมันจะเขียนทับ / แทนที่ overins


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.