Python 条件合并列表
假设我有两张清单Python 条件合并列表,python,list,merge,conditional,Python,List,Merge,Conditional,假设我有两张清单 [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,';'] 现在,我们可以压缩您的列表: merged = [] for l1,
[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,';']
现在,我们可以压缩您的列表:
merged = []
for l1,l2 in zip(get_part(list1),get_part(list2)):
merged.extend(l1)
merged.extend(l2)
merged.append(';')
当然,在它的核心,这本质上是对它们进行迭代并结合。。。所以在回答你的问题时,我认为没有更好的办法了
存储列表的更好方法可能是将它们存储为列表列表--例如: 这样存储,您只需执行以下操作:
merged = [ l1 + l2 for l1,l2 in zip(list1,list2) ]
更多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
当然,谢谢你指出这一点
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, ';']
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