从列表中获取元素,循环风格

时间:2015-07-18 12:56:18

标签: python list iteration

我想从列表列表中构建一个列表,循环风格 所有第一个元素,然后是所有第二个元素等 列表的大小不同。

[[1, 2, 3], [4, 5], [6], [], [7, 8, 9, 10]]

应转向:

[1, 4, 6, 7, 2, 5, 8, 3, 9, 10]

4 个答案:

答案 0 :(得分:2)

您可以使用itertools中的roundrobin recipe

from itertools import cycle,islice
def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    pending = len(iterables)
    nexts = cycle(iter(it).next for it in iterables)
    while pending:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            pending -= 1

            nexts = cycle(islice(nexts, pending))

输出:

l = [[1,2,3],[4,5],[6],[],[7,8,9,10]]
print(list(roundrobin(*l)))
[1, 4, 6, 7, 2, 5, 8, 3, 9, 10]

答案 1 :(得分:1)

这适用于良好的旧列表理解。我将线条分开以使其更具可读性。如果你够疯狂的话,你可以将整个事情整合成一行。

mainlist = [[1, 2, 3], [4, 5], [6], [], [7, 8, 9, 10]]
longest = len(max(mainlist, key = len))
newlist = [sublist[i]
           for i in range(longest)
           for sublist in mainlist
           if len(sublist) > i]

# [1, 4, 6, 7, 2, 5, 8, 3, 9, 10]

答案 2 :(得分:0)

它找到lst中最大的列表,它将确定将完成多少轮流行音乐。每个弹出元素都会添加到输出列表(o)。

版本1(测试here):

lst = [[1,2,3],[4,5],[6],[],[7,8,9,10]]
o = []

mx = len( max(lst, key=len) )
o = [ i.pop(0) for m in range(mx) for i in lst if len(i) != 0 ]

print(o)

版本2(测试它here):

lst = [[1,2,3],[4,5],[6],[],[7,8,9,10]]
o = []

mx = len( max(lst, key=len) )

while mx > 0:
    for i in lst:
        if len(i) != 0:
            o.append( i.pop(0) )
    mx -= 1

print(o)

输出:

[1, 4, 6, 7, 2, 5, 8, 3, 9, 10]

答案 3 :(得分:0)

就是:

current_item = list[0]
list.append(list.pop(list.index(list[0])))

当前项目将始终是列表中的下一个项目。