結合したい 2 つのリストがありますが、リスト内のアイテムの数を増やす代わりに、一致するインデックスを持つアイテムを実際に結合したいと考えています。例えば:
List1 = ['A', 'B', 'C']
List2 = ['1', '2', '3']
List3 = ['A1', 'B2', 'C3']
単純に 2 つのリストを結合することについて、他にもかなりの数の質問を見てきましたが、残念ながら、達成できるものは何も見つかりませんでした。
どんな助けでも大歓迎です。乾杯。
結合したい 2 つのリストがありますが、リスト内のアイテムの数を増やす代わりに、一致するインデックスを持つアイテムを実際に結合したいと考えています。例えば:
List1 = ['A', 'B', 'C']
List2 = ['1', '2', '3']
List3 = ['A1', 'B2', 'C3']
単純に 2 つのリストを結合することについて、他にもかなりの数の質問を見てきましたが、残念ながら、達成できるものは何も見つかりませんでした。
どんな助けでも大歓迎です。乾杯。
>>> List1 = ['A', 'B', 'C']
>>> List2 = ['1', '2', '3']
>>> [x + y for x, y in zip(List1, List2)]
['A1', 'B2', 'C3']
map(''.join,zip(List1,List2,List3))
>>>
['A1A1', 'B2B2', 'C3C3']
説明:
zip(List1,List2,List3)
戻り値
[('A', '1', 'A1'), ('B', '2', 'B2'), ('C', '3', 'C3')]
各タプルN
は、圧縮されたリストのインデックスに関連付けられた要素を表します。各タプルの要素を単一の文字列に結合したいと考えています。単一のタプルの場合、次のことができます。
>>> ''.join(('A', '1', 'A1'))
'A1A1'
目的の結果を生成するため、したがって目的のすべての文字列のリストを取得するには、このjoin
関数を次のようにすべてのタプルにマップします。
map(''.join,zip(List1,List2,List3))
その結果
['A1A1', 'B2B2', 'C3C3']
List1
したがって、追加したい場合はList2
map(''.join,zip(List1,List2))
>>>
['A1', 'B2', 'C3']
いくつかのタイミング:
Microsoft Windows [Version 6.2.9200]
(c) 2012 Microsoft Corporation. All rights reserved.
C:\Users\Henry>python -m timeit -s "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2','3']*10**5" "map(lambda x, y: x + y, List1, List2)"
10 loops, best of 3: 44 msec per loop
C:\Users\Henry>python -m timeit -s "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "[x + y for x, y in zip(List1, List2)]"
10 loops, best of 3: 44 msec per loop
C:\Users\Henry>python -m timeit -s "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "map(''.join,zip(List1,List2))"
10 loops, best of 3: 42.6 msec per loop
C:\Users\Henry>python -m timeit -s "from operator import add" "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "map(add, List1, List2)"
10 loops, best of 3: 28.6 msec per loop
zipの代わりにizipを使用する
Microsoft Windows [Version 6.2.9200]
(c) 2012 Microsoft Corporation. All rights reserved.
C:\Users\Henry>python -m timeit -s "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2','3']*10**5" "map(lambda x, y: x + y, List1, List2)"
10 loops, best of 3: 44.1 msec per loop
C:\Users\Henry>python -m timeit -s "from itertools import izip" "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "[x + y for x, y in izip(List1, List2)]"
10 loops, best of 3: 31.3 msec per loop
C:\Users\Henry>python -m timeit -s "from itertools import izip" "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "map(''.join,izip(List1,List2))"
10 loops, best of 3: 36.2 msec per loop
C:\Users\Henry>python -m timeit -s "from operator import add" "List1 = ['A', 'B', 'C']*10**5; List2 = ['1', '2', '3']*10**5" "map(add, List1, List2)"
10 loops, best of 3: 28.6 msec per loop
バラエティーに追加するには (Python 2.7)
List3 = ['{}{}'.format(x, y) for x, y in zip(List1, List2)]
他の多くの回答からわかるように、Python でこれを解決するには複数の方法があります。そのような例の 1 つを次に示します。
>>> from operator import add
>>> List1 = ['A', 'B', 'C']
>>> List2 = ['1', '2', '3']
>>> map(add, List1, List2)
['A1', 'B2', 'C3']
ただし、本質的に探しているのはzipWith
、簡単に説明できるという理由だけで hoogle にリンクしており、Python には zipWith の標準実装がないということです。と2 つのリストなどの 2zipWith
項関数を指定すると、各ペアに適用される関数と一緒に 'd されoperator.add
たリストが返されます。zip
このアイデアを抽象化して、2 項演算子を使用して 2 つ以上のリストを操作することができます。
>>> def zipWith(f, *iterables):
... return map(f, *iterables)
余談: これは大したことをしていないように見えるかもしれませんが、何が起こっているかについてのセマンティクスを提供しています。zip
関数で iterables に ping を実行します。これは、マップ バージョンを使用するよりも読みやすくなります。
次に、入力リストの数を関数のアリティに一致させる限り、任意の関数で使用できますf
。例えば:
>>> zipWith(lambda a, b, c: a + b * c, [1, 2, 3], [1, 2, 3], [1, 2, 3])
[2, 6, 12]
>>> zipWith(lambda a, b, c: (a + b) * c, List1, List2, [1, 2, 3])
['A1', 'B2B2', 'C3C3C3']
>>> zipWith(lambda a, b: a + b, List1, List2)
['A1', 'B2', 'C3']
>>> zipWith(add, List1, List2)
['A1', 'B2', 'C3']