不确定如何让这个人完成......
有:
L1 = [1,2,3]
L2 = [a,b,c]
想:
[1,a,2,b,3,c]
答案 0 :(得分:12)
import itertools
L1 = [1,2,3]
L2 = ['a','b','c']
list(itertools.chain.from_iterable(itertools.izip(L1, L2)))
您可以将izip_longest
与填充值一起用于不均匀长度列表。
答案 1 :(得分:5)
压缩列表然后展平结果:
Z = zip(L1, L2)
print [x for item in Z for x in item]
答案 2 :(得分:0)
漫长道路:
假设两个列表的长度相同:
merged = []
for x in range(len(L1)):
merged.append(L1[x])
merged.append(L2[x])
如果不是,请取两个数组的长度,比较它们,保持较长列表的长度。然后运行较大列表的范围(len())的代码,并在x大于最小列表的最后一个索引后,在那里运行一个if语句,该语句将运行更大的列表(仅附加较大列表的值) 。这可能要求您将每个列表存储在标记为“较小”和“较大”的两个不同列表中,或者在比较后存储类似的列表。
短道:
压缩列表。
答案 3 :(得分:0)
压缩并对结果求和:
sum(zip(L1, L2), ())
答案 4 :(得分:0)
尽管chain
+ zip
(在Python 2上为izip
)在这种情况下有效,但如果输入的长度不均匀,它会静默删除数据。在某些情况下,您想无限循环,直到耗尽所有输入为止。
为此,最通用的解决方案是来自the itertools
module的roundrobin
食谱:
from itertools import cycle, islice
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
num_active = len(iterables)
nexts = cycle(iter(it).__next__ for it in iterables)
while num_active:
try:
for next in nexts:
yield next()
except StopIteration:
# Remove the iterator we just exhausted from the cycle.
num_active -= 1
nexts = cycle(islice(nexts, num_active))
对于您的输入,此方法有效:
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
print(list(roundrobin(list1, list2))) # Outputs [1, 'a', 2, 'b', 3, 'c']
但是对于不匹配的输入,它仍然可以工作而不会丢失数据:
list1 = [1, 2, 3, 4, 5]
list2 = ['a', 'b', 'c']
print(list(roundrobin(list1, list2))) # Outputs [1, 'a', 2, 'b', 3, 'c', 4, 5]