Dezelfde string toevoegen aan een lijst met strings in Python

Ik probeer één string te nemen en deze toe te voegen aan elke string in een lijst, en dan een nieuwe lijst te maken met de voltooide strings. Voorbeeld:

list1 = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
*magic*
list2 = ['foobar', 'fobbar', 'fazbar', 'funkbar']

Ik heb geprobeerd om loops te maken, en een poging om de lijst te begrijpen, maar het was rommel. Zoals altijd wordt alle hulp zeer op prijs gesteld.


Antwoord 1, autoriteit 100%

De eenvoudigste manier om dit te doen is met een lijstbegrip:

[s + mystring for s in mylist]

Merk op dat ik het gebruik van ingebouwde namen zoals listheb vermeden omdat dat de ingebouwde namen overschaduwt of verbergt, wat zeer slecht is.

Als je niet echt een lijst nodig hebt, maar alleen een iterator, kan een generator-expressie efficiënter zijn (hoewel het er waarschijnlijk niet toe doet op korte lijsten):

(s + mystring for s in mylist)

Deze zijn zeer krachtig, flexibel en beknopt. Elke goede python-programmeur zou ze moeten leren hanteren.


Antwoord 2, autoriteit 9%

my_list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
my_new_list = [x + string for x in my_list]
print my_new_list

Hiermee wordt afgedrukt:

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

Antwoord 3, autoriteit 2%

maplijkt mij de juiste tool voor de klus.

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

Zie dit gedeelteover functionele programmeertools voor meer voorbeelden van map.


Antwoord 4

Het volgende experiment op de pythonische manier uitvoeren:

[s + mystring for s in mylist]

lijkt ~35% sneller te zijn dan het voor de hand liggende gebruik van een for-lus zoals deze:

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

Experimenteren

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)

Resultaten

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

Antwoord 5

Update met meer opties

Hieronder staan ​​enkele van de methoden die ik heb gevolgd, en ik weet zeker dat er meer kunnen zijn.

Methode 1:

list1 = ['foo', 'fob', 'faz', 'funk']
list2 = [ls+"bar" for ls in list1] # using list comprehension
print(list2)

Methode 2:

list1 = ['foo', 'fob', 'faz', 'funk']
list2 = list(map(lambda ls: ls+"bar", list1))
print(list2)

Methode 3:

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

Methode 4:

list1 = ['foo', 'fob', 'faz', 'funk']
addstring = 'bar'
list2 = []
for value in list1:
    list2.append(str(value) + "bar")
print(list2)

Methode 5:

list1 = ['foo', 'fob', 'faz', 'funk']
list2 = list(map(''.join, zip(list1, ["bar"]*len(list1))))
print(list2)

Vermijd het gebruik van zoekwoorden als variabelen zoals ‘list’, hernoem ‘list’ in plaats daarvan naar ‘list1’


Antwoord 6

Hier is een eenvoudig antwoord met behulp van pandas.

import pandas as pd
list1 = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
list2 = (pd.Series(list1) + string).tolist()
list2
# ['foobar', 'fobbar', 'fazbar', 'funkbar']

Antwoord 7

Een beetje uitbreiden naar “Een lijst met tekenreeksen toevoegen aan een lijst met tekenreeksen”:

   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)

Resultaat:

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

dtype odject kan verder worden geconverteerd str


Antwoord 8

je kunt lambda inside map in python gebruiken. schreef een grijze codes generator.
https://github.com/rdm750/rdm750.github .io/blob/master/python/gray_code_generator.py
# uw code komt hier
”’
de n-1 bitcode, met 0 voor elk woord, gevolgd door
de n-1 bitcode in omgekeerde volgorde, met 1 voor elk woord.
”’

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

Antwoord 9

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

En gebruik listniet als naam; het schaduwt het ingebouwde type.


Antwoord 10

new_list = [word_in_list + end_string for word_in_list in old_list]

Het gebruik van namen zoals “list” voor uw variabelenamen is slecht omdat het de ingebouwde functies zal overschrijven/overschrijven.


Antwoord 11

Voor het geval dat

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

Antwoord 12

Combinatie van mapen format:

>>> list(map('{0}bar'.format,  ['foo', 'fob', 'faz', 'funk']))
['foobar', 'fobbar', 'fazbar', 'funkbar']

Other episodes