2 つのリストがあるとします。
[16, 0, 0, ';', 17, 0, 2, ';', 0, 2, 1, ';']
[-1, 0, ';', 0, -2, ';', -2, -1, ';']
これらのリスト要素を「;」を満たす条件付きでマージする簡単な方法はありますか? それらの両方を個別に反復して組み合わせることよりも、
出力は
[16, 0, 0, -1, 0, ';', 17, 0, 2, 0, -2, ';', 0, 2, 1, -2, -2,';']
2 つのリストがあるとします。
[16, 0, 0, ';', 17, 0, 2, ';', 0, 2, 1, ';']
[-1, 0, ';', 0, -2, ';', -2, -1, ';']
これらのリスト要素を「;」を満たす条件付きでマージする簡単な方法はありますか? それらの両方を個別に反復して組み合わせることよりも、
出力は
[16, 0, 0, -1, 0, ';', 17, 0, 2, 0, -2, ';', 0, 2, 1, -2, -2,';']
def get_part(lst,sep=';'):
out = []
for i in lst:
if i == sep:
yield out
out = []
else:
out.append(i)
これで、リストをまとめて圧縮できます。
merged = []
for l1,l2 in zip(get_part(list1),get_part(list2)):
merged.extend(l1)
merged.extend(l2)
merged.append(';')
もちろん、本質的には、これは本質的にそれらの両方を繰り返し処理して結合することです...したがって、あなたの質問への答えとして、より良い方法はないと思います。
おそらく、リストを保存するより良い方法は、リストのリストとして保存することです-例:
list1 = [[16, 0, 0], [ 17, 0, 2], [ 0, 2, 1] ]
このように保存すると、次のことができます。
merged = [ l1 + l2 for l1,l2 in zip(list1,list2) ]
>>> from itertools import groupby, izip, chain
>>> L1=[16, 0, 0, ';', 17, 0, 2, ';', 0, 2, 1, ';']
>>> L2=[-1, 0, ';', 0, -2, ';', -2, -1, ';']
>>> g1 = groupby(L1, key=';'.__eq__)
>>> g2 = groupby(L2, key=';'.__eq__)
>>> [i for i1,i2 in izip(g1, g2) for i in ([';'] if i1[0] is True else chain(i1[1], i2[1]))]
[16, 0, 0, -1, 0, ';', 17, 0, 2, 0, -2, ';', 0, 2, 1, -2, -1, ';']
より多くのitertools狂気:
from itertools import groupby, chain, izip, repeat
a = [16, 0, 0, ';', 17, 0, 2, ';', 0, 2, 1, ';']
b = [-1, 0, ';', 0, -2, ';', -2, -1, ';']
wanted = [16, 0, 0, -1, 0, ";",
17, 0, 2, 0, -2, ';',
0, 2, 1, -2, -1,";"]
def split(items, sep=";"):
return (group for key, group in
groupby(items, lambda item: item != sep) if key)
got = list(
chain.from_iterable(
chain.from_iterable(
izip(split(a), split(b), repeat([";"])))))
assert got == wanted