【问题标题】:Pair consecutive elements in a list while iterating [duplicate]迭代时将列表中的连续元素配对[重复]
【发布时间】:2016-03-28 20:22:40
【问题描述】:

我有一个总是包含偶数个元素的列表 我想遍历这个列表以创建一个新列表,其中包含 列表中每 2 个连续数字的列表。

例如:

first_list = [1,2,3,4,5,6,7,8]
second_list = [[1,2], [3,4], [5,6], [7,8]]

当我遍历列表时,我无法弄清楚如何选择连续对。我已经尝试了一百万种变化,这是我最接近的一次。

first_list = [1,2,3,4,5,6,7,8]    
second_list = []

pairs = 1

for item in range(len(first_list) - pairs): 
    second_list.append([firs_list[item],first_list[item + pairs]])
print second list

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

有没有什么方法可以让 for 循环遍历所有其他项目?

【问题讨论】:

  • ^ 最重要的答案是有一个通用的解决方案,可以很好地解决您的问题。 (只需设置或硬编码 n=2 并使用列表理解版本。)

标签: list python-2.7 loops


【解决方案1】:

这段代码应该这样做:

first_list = [1,2,3,4,5,6,7,8]     
second_list = []
for i in range(0,len(first_list)-1,2):
   if first_list[i]+1==first_list[i+1]:
      second_list.append([first_list[i],first_list[i+1]])
print second_list

输出:

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

【讨论】:

  • 这很有趣,但与 OP 要求的结果不同。注意你的对重叠([1, 2], [2, 3]),而原来的没有。
  • 现在看起来不错。实际上,由于您的 if 语句,这是我会赞成的唯一答案。我本来想说这没有必要,但重新阅读这篇文章,我认为你是唯一注意到(并正确实施)该要求的人! (您可能需要检查or,以防它们的顺序相反,例如(7, 6)。)
【解决方案2】:

您可以组合来自itertools 模块的功能。如果没有最外层的map,它会返回一个元组列表,map 会将其转换为一个列表列表:

>>> from itertools import cycle, compress, izip
>>> 
>>> lst = [1,2,3,4,5,6,7,8]
>>> map(list, izip(compress(lst, cycle([1, 0])), compress(lst, cycle([0, 1]))))
[[1, 2], [3, 4], [5, 6], [7, 8]]

【讨论】:

    【解决方案3】:

    你快到了。您需要为范围使用更多参数。

    简单修复:

    for item in range(0, len(first_list) - 1, 2):
        second_list.append([first_list[item],first_list[item + 1]])
    print second_list
    

    range 的参数是 range(start, stop[, step]),并告诉它从零开始直到长度为 1,并使用二步。

    【讨论】:

      最近更新 更多