Додавання тієї ж строки до списку рядків у Python


183

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

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

*magic*

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

Я спробував петлі та спробу зрозуміти список, але це був сміття. Як завжди, будь-яка допомога, дуже цінується.


25
Нерозумно призначати, listоскільки це вбудований.
Нуфал Ібрагім

Відповіді:


315

Найпростіший спосіб зробити це з розумінням списку:

[s + mystring for s in mylist]

Зверніть увагу, що я уникав використовувати вбудовані імена на кшталт, listтому що це тіні або приховує вбудовані імена, що дуже не добре.

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

(s + mystring for s in mylist)

Вони дуже потужні, гнучкі та стислі. Кожен хороший програміст пітонів повинен навчитися ними володіти.


8
Або genexp, якщо вам потрібно ліниво(s + mystring for s in mylist)
Нуфал Ібрагім,

Це, безумовно, зробив трюк, дуже дякую, все ще обертаючи голову навколо розуміння списку, якщо ви знаєте хороший підручник з цього питання. перед кожним елементом у списку є u ', це для unicode?
Кевін

3
@Kevin, ось підручник для рядків Unicode, docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray

Якщо вам потрібен індекс зі списку, який ви можете зробити["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus

1
Щось зауважимо: Якщо ви додасте "містінг" до "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.


2

Виконуючи наступний експеримент пітонічним способом:

[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)

тип відхилення може бути додатково перетворений str


Оновлення: Ви можете уникнути копіювання одного і того ж символу кілька разів: 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, з кожним словом, попереднім 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']

будь ласка, змініть назву змінних зі списку та рядка на щось інше. список - тип вбудованого пітона
sagi

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

І не використовуйте listяк ім'я; це затінює вбудований тип.


Чому '%sbar' % (x,)замість '%sbar' % x? Чому ні x + 'bar'?
Джон Махін

1
Другий вийде з ладу, якщо х станеться кортежем. Очевидно, ви плануєте, щоб кожен елемент був рядком, але іноді справи йдуть не так. Різниця між першим і третім - це переважно смак, якщо ви не отримаєте рядок із зовнішнього джерела.
Ігнасіо Васкес-Абрамс

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.