私は2つのリストを持っています
a = [1,2,3]
b = [9,10]
これらの2つのリストを1つのリストに結合(zip)して、次のc
ようにします。
c = [(1,9), (2,10), (3, )]
これを行うためのPythonの標準ライブラリに関数はありますか?
私は2つのリストを持っています
a = [1,2,3]
b = [9,10]
これらの2つのリストを1つのリストに結合(zip)して、次のc
ようにします。
c = [(1,9), (2,10), (3, )]
これを行うためのPythonの標準ライブラリに関数はありますか?
通常、これには次のものを使用itertools.zip_longest
します。
>>> import itertools
>>> a = [1, 2, 3]
>>> b = [9, 10]
>>> for i in itertools.zip_longest(a, b): print(i)
...
(1, 9)
(2, 10)
(3, None)
ただしzip_longest
、短い反復可能オブジェクトにNone
s(またはパラメーターとして渡す値fillvalue=
)を埋め込みます。それがあなたが望むものでない場合は、理解を使用してsを除外することができますNone
:
>>> for i in (tuple(p for p in pair if p is not None)
... for pair in itertools.zip_longest(a, b)):
... print(i)
...
(1, 9)
(2, 10)
(3,)
ただし、いずれかのiterableにNone
値がある場合は、それらも除外されることに注意してください。それが必要ない場合は、次fillvalue=
の代わりに独自のオブジェクトを定義してフィルタリングしますNone
。
sentinel = object()
def zip_longest_no_fill(a, b):
for i in itertools.zip_longest(a, b, fillvalue=sentinel):
yield tuple(x for x in i if x is not sentinel)
list(zip_longest_no_fill(a, b)) # [(1, 9), (2, 10), (3,)]
別の方法はmap
:
a = [1, 2, 3]
b = [9, 10]
c = map(None, a, b)
(3, None)
の代わりにそれも含まれますが(3,)
。これを行うために、ここに楽しい行があります:
c = (tuple(y for y in x if y is not None) for x in map(None, a, b))
明示的なPythonを記述して、目的の操作を実行することはそれほど難しくありません。
def izip_short(a, b):
ia = iter(a)
ib = iter(b)
for x in ia:
try:
y = next(ib)
yield (x, y)
except StopIteration:
yield (x,)
break
for x in ia:
yield (x,)
for y in ib:
yield (None, y)
a = [1, 2, 3]
b = [9, 10]
list(izip_short(a, b))
list(izip_short(b, a))
b
シーケンスよりも長いシーケンスをどのように処理するかわからなかったので、その場合はタプルの最初の値をa
aに詰め込みます。None
シーケンスごとに明示的なイテレータを取得します。シーケンスから次の値を取得するために手動で使用しながら、a
イテレータをループとして実行します。シーケンスでaを取得すると、ループを中断して、シーケンスの残りの部分を取得します。その後、そのイテレータはすでに使い果たされているため、何も実行されません。あるいは、最初のループがイテレーターを使い果たした場合、2番目のループは何もしませんが、シーケンスに値が残っている可能性があり、ループはそれらを収集します。for
next(ib)
b
StopIteration
b
for x in ia:
a
for y in ib:
for x in ia:
a
for x in ia:
b
for y in ib:
単線:
c = zip(a, b) + [(x,) for x in a[len(b):]] + [(x,) for x in b[len(a):]]
これを再利用したい場合:
def mergeUsNicely(a, b):
def tupleMe(val):
return (val,)
return zip(a, b) + map(tupleMe, a[len(b):]) + map(tupleMe, b[len(a):])