交叉列表没有模块的列表

时间:2018-04-23 19:30:34

标签: python

假设您有以下列表列表:

list1 = [[1,2,3], 
         [9, 0], 
         [5], 
         [-4,-5,-2,-3,-1]];

仅使用基本操作和循环,如何交错列表,结果如下:

result = [1,9,5,-4,2,0,-5,3,-2,-3,-1]

我在这里找到的所有解决方案都使用某种库,但我只对使用循环的解决方案感兴趣。

我目前的解决方案是:

result = []

def interleave(myList):
    for i in range(len(myList)):
        if len(myList[i]) == 0:
            continue
        result.append( myList[i][0] )
        del myList[i][0]
    print result

list1 = [[1,2,3], [9, 0], [5], [-4,-5,-2,-3,-1]]
print list1

interleave(list1)
interleave(list1)
interleave(list1)
interleave(list1)
interleave(list1)

现在有什么技巧,如何将这5个调用放到函数内的interleave函数中,所以我只调用interleave()一次。

3 个答案:

答案 0 :(得分:0)

这可能是使用发电机的好选择。一个简单的算法是创建一个迭代器列表并从每个迭代器中使用一个项,如果它是空的则删除迭代器:

def interleave(l):
    q = [iter(i) for i in l]
    while q:
        n = q.pop(0)
        try:
            yield next(n)
            q.append(n)
        except StopIteration:
            pass

In []:
list(interleave(list1))

Out[]:
[1, 9, 5, -4, 2, 0, -5, 3, -2, -3, -1]

答案 1 :(得分:0)

list1 = [[1,2,3],
         [9, 0], 
         [5], 
         [-4,-5,-2,-3,-1]]

list2 = []

flag = True
while flag:
  for elem in list1:
    if not elem:
      flag = False
    else:
      list2.append(elem.pop(0))
      flag = True




print(list2)  

结果:

[1, 9, 5, -4, 2, 0, -5, 3, -2, -3, -1]

答案 2 :(得分:0)

另一种方法如下:首先,找到长度最大的子列表。然后对于该长度中的数字范围(即具有最大长度的子列表的索引),遍历每个子列表并检查该范围的当前数量是否小于其长度(这意味着它可以在没有冒险IndexError的情况下获取索引,取出该数字并将其存储在新列表中。下面的代码展示了我的想法:

def interleave(inList):
    maximumLength = len(max(inList, key=len))
    return [elem[i] for i in range(maximumLength) for elem in list1 if i < len(elem)]

list1 = [[1,2,3], [9, 0], [5], [-4,-5,-2,-3,-1]]

print(interleave(list1))

输出:

[1, 9, 5, -4, 2, 0, -5, 3, -2, -3, -1]