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

183

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

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

*magic*

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

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

Kevin
источник
25
Неразумно присваивать, listтак как это встроенный.
Нуфал Ибрагим

Ответы:

315

Самый простой способ сделать это с помощью понимания списка:

[s + mystring for s in mylist]

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

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

(s + mystring for s in mylist)

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

gahooa
источник
8
Или генэксп, если хотите лениво(s + mystring for s in mylist)
Нуфал Ибрагим
Это определенно помогло, большое спасибо, все еще обдумывая понимание списка, если вы знаете хороший урок по нему. перед каждым элементом в списке стоит u ', это для юникода?
Кевин
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» в начале «s». вот так list2 = ["mystring" + s for s in mylist]=list2 = ['barfoo', 'barfob', 'barfaz', 'barfunk']
Пол Такетт
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.

DMan
источник
2

Запускаем следующий эксперимент питоническим способом:

[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
испуг
источник
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)

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

Артур Соколовский
источник
Обновление: Вы можете избежать многократного копирования одного и того же символа: at = np.full(fill_value='@',shape=1,dtype=object) или просто: at = np.array("@", dtype=object)
Артур Соколовский
1

Вы можете использовать лямбду внутри карты в 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))
Рохит Малгаонкар
источник
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

Избегайте использования ключевых слов в качестве переменных, таких как «список», вместо этого переименуйте «список» в «список1»

Удай Киран
источник
Это хорошее предложение. Другой вариант - использовать 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']
Keiku
источник
пожалуйста, измените имя переменных из списка и строки на другое. список является встроенным типом Python
Саги
0
list2 = ['%sbar' % (x,) for x in list]

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

Игнасио Васкес-Абрамс
источник
Почему '%sbar' % (x,)вместо '%sbar' % x? Почему нет x + 'bar'?
Джон Мачин
1
Второе потерпит неудачу, если x окажется кортежем. Очевидно, вы планируете, чтобы каждый элемент был строкой, но иногда что-то идет не так. Разница между первым и третьим в основном вкусовая, если только вы не получили строку из внешнего источника.
Игнасио Васкес-Абрамс
2
'повысить исключение'! = 'потерпеть неудачу'. Если у вас неправильный тип данных, вы уже потерпели неудачу. Мое предпочтительное выражение вызывает исключение, подчеркивающее ошибку; Ваше предпочтительное выражение молча производит мусор. Вкус: медленные выражения барокко мне не по вкусу.
Джон Мачин
0
new_list = [word_in_list + end_string for word_in_list in old_list]

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

Нет
источник
0

На всякий случай

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
Tanweer Alam
источник