作成しようとしているプログラムの「メイン」リストのような単一のリストに追加したいリストがたくさんあります。これを10行ではなく1行のコードで行う方法はありますか?私は初心者なので、わからない...
私の質問をよりよく理解するために、これらのリストがあった場合はどうなりますか:
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
そして、yとzをxに追加します。代わりに:
x.append(y)
x.append(z)
1行のコードでこれを行う方法はありますか?私はすでに試しました:
x.append(y, z)
そして、それは動作しません。
x.extend(y+z)
あなたがしたいことをすべき
または
x += y+z
あるいは
x = x+y+z
コメントを拡張する
In [1]: x = [1, 2, 3]
In [2]: y = [4, 5, 6]
In [3]: z = [7, 8, 9]
In [4]: from itertools import chain
In [5]: print list(chain(x,y,z))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
開始値(空のリスト)を指定してsum
関数を使用できます。
a = sum([x, y, z], [])
これは、任意の数のリストを追加する場合に特に適しています。
追加の効果を正確に再現するには、単純で効果的な次の機能を試してください。
a=[]
def concats (lists):
for i in lists:
a==a.append(i)
concats ([x,y,z])
print(a)
上記の答えと同等ですが、言及する価値があるほど十分に異なります:
my_map = {
'foo': ['a', 1, 2],
'bar': ['b', '2', 'c'],
'baz': ['d', 'e', 'f'],
}
list(itertools.chain(*my_map.values()))
['d', 'e', 'f', 'a', 1, 2, 'b', '2', 'c']
上記の式で、*はチェーンする引数としてのグロッキング結果に重要です。これは前のchain(x、y、z)と同じです。また、結果はハッシュ順になっていることに注意してください。
少し機能的なアプローチを希望する場合は、次を試してください。
import functools as f
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
x = f.reduce(lambda x, y: x+y, [y, z], x)
これにより、任意の数のリストをリストx
に連結できます。
任意の数のリストを連結するだけの場合(つまり、ベースリストに連結しない場合)、次のように単純化できます。
import functools as f
from operator import add
big_list = f.reduce(add, list_of_lists)
BFDLには、ラムダ、リデュース、およびフレンドに関して彼の予約があることに注意してください。 https://www.artima.com/weblogs/viewpost.jsp?thread=98196
この回答を完了するには、ドキュメントでreduceの詳細をご覧ください: https://docs.python.org/3/library/functools.html#functools.reduce
「シーケンスを単一の値に減らすために、左から右に2つの引数の関数をシーケンスの項目に累積的に適用します。」
追伸 https://stackoverflow.com/a/41752487/53251 で説明されているようにsum()
を使用すると、非常にコンパクトで、リストで機能するように見え、非常に高速です(参照- https://stackoverflow.com/a/33277438/53251 )ただし、Python 3.6のhelp(sum)
には次のように書かれています:
この関数は、特に数値での使用を目的としており、非数値型を拒否する場合があります。
これは少し心配ですが、おそらくリストを連結するための最初のオプションとして保持します。
1行で、次の方法で実行できます。
x.extend(y+z)
または
x=x+y+z