【问题标题】:How to group list items into sequential tuples in Python? [duplicate]如何在 Python 中将列表项分组为顺序元组? [复制]
【发布时间】:2019-06-10 11:12:15
【问题描述】:

我有一个列表,其中包含按升序排列的数字

[0, 1, 3, 4, 6]

[2, 3, 4, 5]

我需要获取一个列表列表,其中包含作为范围项目的元素,例如

[[start, end], [start, end]] 来自输入列表。

[[0, 1], [3, 4], [6, 6]]

[[2, 5]]

输入列表中不存在的元素应该放在哪里。

这是我尝试过的代码。但不知道如何获得。

zers = [0, 1, 3, 4, 6]
ls = []
for i, j in enumerate(zers):
    if i!=len(zers)-1 and zers[i+1]==zers[i]+1:last=i;continue
    else:
        if i==0:ls.append([i,i])
        else:ls.append([last, i])
print(ls) 

应该给[[0, 1], [3, 4], [6, 6]] 但是给[[0, 1], [2, 3], [2, 4]]

请随时对我的代码进行任何修改或提供完全不同的解决方案。

我认为现有库中应该有一个函数,但不确定。如果您遇到这种情况,请告诉我。

【问题讨论】:

  • enumerate 增加了混乱。它产生的对是“索引”、“值”。您只使用索引,而忽略了值,因此它等同于 for i in range(len(zers)):
  • 我可以像[[0, 3], [4, 6]] 一样从[0, 1, 3, 4, 6] 生成一个列表吗?你如何有所作为?
  • [0, 3] 是错误的,因为它不包含 2。
  • @Shahroozevsky 您的示例不正确。再次阅读帖子。对于您的示例,正​​确的结果是[[0, 1], [3, 4], [6, 6]]。您提出的输出意味着2 存在于13 之间,但显然不是。
  • @Shahroozevsky 不。元组项应该类似于范围。 [Start, End] 该范围内的所有数字都应该出现在输入列表中。

标签: python python-3.x list python-3.6 sequence


【解决方案1】:

使用more_itertools.consecutive_groups 将连续元素组成组,然后从组中获取第一个和最后一个元素:

import more_itertools as mit

iterable = [0, 1, 3, 4, 6]
x = [list(group) for group in mit.consecutive_groups(iterable)]

output = [[i[0],i[-1]] for i in x]
print(output)

输出:

[[0, 1], [3, 4], [6, 6]]

【讨论】:

    猜你喜欢
    • 2013-02-22
    • 2021-03-31
    • 2017-07-30
    • 2019-10-20
    • 2014-03-19
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2013-02-22
    相关资源
    最近更新 更多