Anhängen derselben Zeichenfolge an eine Liste von Zeichenfolgen in Python


182

Ich versuche, eine Zeichenfolge zu nehmen und sie an jede in einer Liste enthaltene Zeichenfolge anzuhängen und dann eine neue Liste mit den abgeschlossenen Zeichenfolgen zu erstellen. Beispiel:

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

*magic*

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

Ich habe versucht, Schleifen zu erstellen und Listen zu verstehen, aber es war Müll. Wie immer jede Hilfe sehr geschätzt.


25
Es ist unklug zuzuweisen, listda es ein eingebautes ist.
Noufal Ibrahim

Antworten:


313

Der einfachste Weg, dies zu tun, ist mit einem Listenverständnis:

[s + mystring for s in mylist]

Beachten Sie, dass ich es vermieden habe, eingebaute Namen zu verwenden, listda dies die eingebauten Namen beschattet oder verbirgt, was sehr viel nicht gut ist.

Wenn Sie keine Liste benötigen, sondern nur einen Iterator, kann ein Generatorausdruck effizienter sein (obwohl dies in kurzen Listen wahrscheinlich keine Rolle spielt):

(s + mystring for s in mylist)

Diese sind sehr leistungsfähig, flexibel und prägnant. Jeder gute Python-Programmierer sollte lernen, mit ihnen umzugehen.


8
Oder ein Genexp, wenn Sie es faul wollen(s + mystring for s in mylist)
Noufal Ibrahim

Das hat definitiv den Trick getan, vielen Dank, und ich habe mich immer noch mit dem Listenverständnis beschäftigt, wenn Sie ein gutes Tutorial dazu kennen. Vor jedem Element in der Liste steht ein u '. Ist das für Unicode?
Kevin

2
@ Kevin, hier ist ein Tutorial für Unicode-Strings, docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray

Wenn Sie den Index aus der Liste benötigen, können Sie tun["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus

1
Beachten Sie Folgendes: Wenn Sie den "mystring" vor dem "s" und nicht nach dem "s" hinzufügen, wird der "mystring" am Anfang des "s" verkettet. wie so 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

Dies wird gedruckt:

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

5

map scheint mir das richtige Werkzeug für den Job zu sein.

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

Weitere Beispiele für funktionale Programmiertools finden Sie in diesem Abschnittmap .


2

Führen Sie das folgende Experiment auf pythonische Weise aus:

[s + mystring for s in mylist]

scheint ~ 35% schneller zu sein als die offensichtliche Verwendung einer for-Schleife wie folgt:

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

Experiment

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)

Ergebnisse

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

Erweitern eines Bits auf "Anhängen einer Liste von Zeichenfolgen an eine Liste von Zeichenfolgen":

    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)

Ergebnis:

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

dtype odject kann weiter konvertiert werden str


Update: Sie können vermeiden, dasselbe Symbol mehrmals zu kopieren: at = np.full(fill_value='@',shape=1,dtype=object) oder einfach: at = np.array("@", dtype=object)
Artur Sokolovsky

1

Sie können Lambda innerhalb der Karte in Python verwenden. schrieb einen Gray-Codes-Generator. https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # Ihr Code steht hier '' 'der n-1-Bit-Code, wobei jedem Wort 0 vorangestellt ist, gefolgt von dem n-1-Bit-Code in umgekehrter Reihenfolge, wobei jedem Wort 1 vorangestellt ist. '' '

    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

Aktualisierung mit mehr Optionen

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

Vermeiden Sie die Verwendung von Schlüsselwörtern als Variablen wie "Liste" und benennen Sie "Liste" stattdessen in "Liste1" um


Dies ist ein guter Vorschlag. Eine andere Möglichkeit wäre, array_map mit einer Funktion zu verwenden, die die Zeichenfolge anfügt
ROunofF

1

Hier ist eine einfache Antwort mit pandas.

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

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

Bitte ändern Sie den Namen der Variablen von Liste und Zeichenfolge in etwas anderes. Liste ist ein eingebauter Python-Typ
Sagi

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

Und nicht listals Namen verwenden; Es schattiert den eingebauten Typ.


Warum '%sbar' % (x,)statt '%sbar' % x? Warum nicht x + 'bar'?
John Machin

1
Die zweite schlägt fehl, wenn x zufällig ein Tupel ist. Natürlich planen Sie , dass jedes Element eine Zeichenfolge ist, aber manchmal geht etwas schief. Der Unterschied zwischen dem ersten und dem dritten ist hauptsächlich der Geschmack, es sei denn, Sie beziehen die Zeichenfolge von einer externen Quelle.
Ignacio Vazquez-Abrams

2
'Ausnahme auslösen'! = 'fehlschlagen'. Wenn Sie den falschen Datentyp haben, sind Sie bereits gescheitert. Mein bevorzugter Ausdruck löst eine Ausnahme aus, die den Fehler hervorhebt. Ihr bevorzugter Ausdruck erzeugt lautlos Müll. Geschmack: Barock langsame Ausdrücke sind nicht nach meinem Geschmack.
John Machin

0
new_list = [word_in_list + end_string for word_in_list in old_list]

Die Verwendung von Namen wie "Liste" für Ihre Variablennamen ist schlecht, da dadurch die integrierten Funktionen überschrieben / überschrieben werden.


0

Nur für den Fall

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
for i in range(len(list)):
    list[i] += string
print(list)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.