我想从列表列表中构建一个列表,循环风格 所有第一个元素,然后是所有第二个元素等 列表的大小不同。
[[1, 2, 3], [4, 5], [6], [], [7, 8, 9, 10]]
应转向:
[1, 4, 6, 7, 2, 5, 8, 3, 9, 10]
。
答案 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])))
当前项目将始终是列表中的下一个项目。