Добавление одной и той же строки в список строк в Python

Я пытаюсь взять одну строку и добавить ее к каждой строке, содержащейся в списке, а затем добавить новый список с завершенными строками. Пример:

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

*magic*

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

Я пробовал использовать циклы и пытаюсь понять список, но это был мусор. Как всегда, любая помощь, очень ценится.

Ответ 1

Самый простой способ сделать это - со списком:

[s + mystring for s in mylist]

Обратите внимание, что я избегал использования встроенных имен, таких как list, потому что это тени или скрывает встроенные имена, что очень не очень хорошо.

Кроме того, если вам действительно не нужен список, но просто нужен итератор, выражение генератора может быть более эффективным (хотя в коротких списках оно маловероятно):

(s + mystring for s in mylist)

Они очень мощные, гибкие и лаконичные. Каждый хороший программист на Python должен научиться владеть ими.

Ответ 2

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']

Ответ 3

Я не нашел способ прокомментировать ответы до сих пор. Так вот оно. Я поддерживаю ответ Игнасио Васкес-Абрамса list2 = ['%sbar' % x for x in list].

Другие ответы с [string + "bar" for string in list] будут работать в большинстве случаев, но если вы примете более общее решение для простейшего случая - IMHO - следуя принципам проектирования Python. Должен быть предпочтительно один очевидный способ сделать это. %sbar работает все время.

Ответ 4

map кажется правильным инструментом для работы.

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

Подробнее о map см. в этом разделе о инструментах функционального программирования.

Ответ 5

Выполняя следующий эксперимент, питонический путь:

[s + mystring for s in mylist]

кажется ~ 35% быстрее, чем очевидное использование цикла for следующим образом:

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

Ответ 6

Расширяем немного до "Добавление списка строк в список строк":

    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(['[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]'], dtype=object)

Объект dtype может быть далее преобразован

Ответ 7

вы можете использовать lambda внутри карты в python. написал генератор серых кодов. 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))

Ответ 8

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

И не используйте list как имя; он затеняет встроенный тип.

Ответ 9

new_list = [word_in_list + end_string for word_in_list in old_list]

Использование имен, таких как "список" для ваших имен переменных, плохо, поскольку оно будет перезаписывать/переопределять встроенные функции.

Ответ 10

Вот простой ответ с использованием pandas.

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

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

Ответ 11

Так, на всякий случай

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