Dołączanie tego samego ciągu do listy ciągów w Pythonie

183

Próbuję pobrać jeden ciąg i dołączyć go do każdego ciągu zawartego na liście, a następnie utworzyć nową listę z ukończonymi ciągami. Przykład:

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

*magic*

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

Próbowałem pętli i próby zrozumienia listy, ale to była śmieci. Jak zawsze wszelka pomoc, bardzo ceniona.

Kevin
źródło
25
Przypisywanie tego jest nierozsądne, listponieważ jest wbudowane.
Noufal Ibrahim,

Odpowiedzi:

315

Najprostszym sposobem na to jest zrozumienie listy:

[s + mystring for s in mylist]

Zauważ, że unikałem używania wbudowanych nazw, takich jak listponieważ ukrywa lub ukrywa wbudowane nazwy, co jest bardzo złe.

Ponadto, jeśli tak naprawdę nie potrzebujesz listy, a potrzebujesz tylko iteratora, wyrażenie generatora może być bardziej wydajne (chociaż prawdopodobnie nie ma znaczenia na krótkich listach):

(s + mystring for s in mylist)

Są to bardzo wydajne, elastyczne i zwięzłe. Każdy dobry programista pythonowy powinien nauczyć się z nich korzystać.

gahooa
źródło
8
Lub genotyp, jeśli chcesz go leniwie(s + mystring for s in mylist)
Noufal Ibrahim,
To zdecydowanie załatwiło sprawę, dziękuję bardzo, wciąż otaczając moją głowę listą, jeśli znasz dobry samouczek. przed każdą pozycją na liście znajduje się u, czy to unicode?
Kevin
3
@Kevin, oto samouczek dotyczący ciągów znaków Unicode, docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray
Jeśli potrzebujesz indeksu z listy, możesz to zrobić["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus
1
Coś, na co należy zwrócić uwagę: jeśli dodasz „tajemnicę” przed „s”, a nie później, to połączy „tajemnicę” na początku „s”. tak 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

Spowoduje to wydrukowanie:

['foobar', 'fobbar', 'fazbar', 'funkbar']
Tendayi Mawushe
źródło
5

map wydaje mi się właściwym narzędziem do pracy.

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

Aby znaleźć więcej przykładów, zobacz tę sekcję na temat funkcjonalnych narzędzi programistycznych map.

DMan
źródło
2

Przeprowadzenie następującego eksperymentu w pythonowy sposób:

[s + mystring for s in mylist]

wydaje się być ~ 35% szybszy niż oczywiste użycie pętli for:

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

Eksperyment

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)

Wyniki

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
boj
źródło
2

Rozszerzając nieco do „Dołączanie listy ciągów do listy ciągów”:

    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)

Wynik:

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

dtype odject może być dalej konwertowany str

Artur Sokołowski
źródło
Aktualizacja: Możesz uniknąć wielokrotnego kopiowania tego samego symbolu: at = np.full(fill_value='@',shape=1,dtype=object) lub po prostu: at = np.array("@", dtype=object)
Artur Sokolovsky
1

możesz użyć lambda wewnątrz mapy w Pythonie. napisał generator szarych kodów. https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # Twój kod idzie tutaj '' 'kod bitowy n-1, z 0 przed każdym słowem, po którym następuje n-1 bitowy kod w odwrotnej kolejności, z 1 dopisanym do każdego słowa. ''

    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))
Rohit Malgaonkar
źródło
1

Aktualizacja o więcej opcji

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

Unikaj używania słów kluczowych jako zmiennych takich jak „lista”, a zamiast tego zmieniono nazwę „lista” na „lista1”

Uday Kiran
źródło
To dobra sugestia. Innym byłoby użycie array_map z funkcją, która dołącza ciąg ... php.net/manual/en/function.array-map.php
ROunofF
1

Oto prosta odpowiedź przy użyciu pandas.

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

list2 = (pd.Series(list1) + string).tolist()
list2
# ['foobar', 'fobbar', 'fazbar', 'funkbar']
Keiku
źródło
zmień nazwę zmiennych z listy i łańcucha na coś innego. lista jest wbudowanym typem python
sagi
0
list2 = ['%sbar' % (x,) for x in list]

I nie używaj listjako nazwy; przesłania wbudowany typ.

Ignacio Vazquez-Abrams
źródło
Dlaczego '%sbar' % (x,)zamiast '%sbar' % x? Dlaczego nie x + 'bar'?
John Machin,
1
Drugi nie powiedzie się, jeśli x będzie krotką. Oczywiście planujesz mieć każdy element jako ciąg znaków, ale czasem coś idzie nie tak. Różnica między pierwszym a trzecim polega głównie na smaku, chyba że otrzymasz ciąg z zewnętrznego źródła.
Ignacio Vazquez-Abrams,
2
„zgłaszaj wyjątek”! = „fail”. Jeśli masz niewłaściwy typ danych, już się nie udało. Moje preferowane wyrażenie podnosi wyjątek podkreślający niepowodzenie; twoje preferowane wyrażenie cicho produkuje śmieci. Smak: barokowe powolne wyrażenia nie są w moim guście.
John Machin,
0
new_list = [word_in_list + end_string for word_in_list in old_list]

Używanie nazw takich jak „lista” dla nazw zmiennych jest złe, ponieważ spowoduje to zastąpienie / zastąpienie wbudowanych funkcji.

nie
źródło
0

W razie czego

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
Tanweer Alam
źródło