Python组合列表 - 保留相对排序

时间:2011-04-28 14:37:46

标签: python list

不确定如何让这个人完成......

有:

L1 = [1,2,3]
L2 = [a,b,c]

想:

[1,a,2,b,3,c]

5 个答案:

答案 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 moduleroundrobin食谱:

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]