Pythonの文字列リストに同じ文字列を追加する


183

1つの文字列を取得し、それをリストに含まれるすべての文字列に追加して、完成した文字列を含む新しいリストを作成しようとしています。例:

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

*magic*

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

forループを試して、リストを理解しようとしましたが、それはゴミでした。いつものように、どんな助けでも大歓迎です。


25
list組み込みなので、割り当てるのは賢明ではありません。
Noufal Ibrahim、2010

回答:


315

これを行う最も簡単な方法は、リスト内包表記を使用することです。

[s + mystring for s in mylist]

組み込み名をlist隠したり隠したりするなど、組み込み名の使用を避けたことに注意してください。

また、リストが実際には必要なく、イテレータだけが必要な場合は、ジェネレータ式の方が効率的です(ただし、短いリストでは問題にならない可能性があります)。

(s + mystring for s in mylist)

これらは非常に強力で柔軟性があり、簡潔です。すべての優れたPythonプログラマーは、それらを使用する方法を学ぶ必要があります。


8
または、遅延を必要とする場合はgenexp(s + mystring for s in mylist)
Noufal Ibrahim 2010

これで間違いなくトリックはうまくいきました。良いチュートリアルを知っていれば、リストの理解に頭を悩ませることに感謝します。リストの各項目の前にu 'がありますが、それはUnicodeの場合ですか?
Kevin

3
@Kevin、これはユニコード文字列のチュートリアル、docs.python.org
tutorial / introduction.html#

リストのインデックスが必要な場合は、次のことができます["{}) {}".format(i, s) for i, s in enumerate(mylist)]
Vapid Linus

1
注意点: "mystring"を "s"の後ではなく前に追加すると、 "s"の先頭に "mystring"が連結されます。のように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

次の実験をpythonicの方法で実行します。

[s + mystring for s in mylist]

このようなforループの明らかな使用よりも〜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)

dtype odjectはさらにstrに変換できます


更新:同じシンボルを複数回コピーすることを避けることができます: at = np.full(fill_value='@',shape=1,dtype=object) または単に: at = np.array("@", dtype=object)
Artur Sokolovsky

1

Pythonのマップ内でラムダを使用できます。グレイコードジェネレータを書いた。 https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py# ここにコードが入ります '' '各単語の前に0が付加された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

キーワードを「list」のような変数として使用しないでください。代わりに「list」の名前を「list1」に変更しました


これは良い提案です。もう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']

変数の名前をリストと文字列から別のものに変更してください。リストは組み込みのPythonタイプです
sagi

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

list名前として使用しないでください。組み込み型をシャドウします。


なぜ'%sbar' % (x,)代わりに'%sbar' % x?なんでx + 'bar'
John Machin

1
xがタプルの場合、2番目は失敗します。明らかに、すべての要素を文字列にする予定ですが、場合によっては問題が発生することもあります。最初と3番目の違いは、外部ソースから文字列を取得しない限り、ほとんど味です。
Ignacio Vazquez-Abrams

2
'例外を上げる'!= '失敗'。データ型が間違っている場合は、すでに失敗してます。私の好みの表現では、失敗を強調する例外が発生します。あなたの好みの表現はサイレントにゴミを生成します。味わい:バロックのゆっくりとした表情は私の好みではありません。
John Machin、2010年

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

変数名に「リスト」などの名前を使用すると、組み込みが上書き/オーバーライドされるため、不適切です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.