Python 无模块列表的交错列表
假设您有以下列表:Python 无模块列表的交错列表,python,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
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()
一次。这可能是使用生成器的一个好选择。一个简单的算法是创建一个迭代器列表,并使用每个迭代器中的一项,如果迭代器为空,则删除该迭代器:
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, 9, 5, -4, 2, 0, -5, 3, -2, -3, -1]
另一种方法是:首先,找到长度最大的子列表。然后,对于该长度的数字范围(即长度最大的子列表的索引),循环遍历每个子列表,并检查该范围的当前数字是否小于其长度(这意味着可以在不冒
indexer
风险的情况下获取索引),获取该数字并将其存储在新列表中。下面是演示我想法的代码:
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))
张贴您目前掌握的代码,并具体解释您遇到的问题。我们不是来为您做功课的——帮助我们了解您遇到的问题或您考虑过的方法,这是可以回答的。现在你应该解释一下你目前的解决方案到底出了什么问题,以及为什么它会让你感到困惑。@AdamSmith这不是一个家庭作业。我在练习代码,我试图理解基本的算法。不管怎样,我用我现在的答案编辑了这个问题code@AdhySatya一个小小的吹毛求疵:这就是你给自己的家庭作业;)不管怎样,这个问题现在是可以回答的——按照麦克尔维的建议去做,这实际上是一个很好的问题
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]