当前位置: 首页 > 面试题库 >

对连续整数进行分组并允许1的间隙

东门新立
2023-03-14
问题内容

在Python中,给定一个排序的整数列表,我将按连续的值对它们进行分组, 允许间隔为1。

例如,给定一个列表my_list

In [66]: my_list
Out[66]: [0, 1, 2, 3, 5, 6, 10, 11, 15, 16, 18, 19, 20]

我想要以下输出:

[[0, 1, 2, 3, 5, 6], [10, 11], [15, 16, 18, 19, 20]]

现在,如果我不必忍受1的差距,我可以采用在此说明的简洁解决方案:

import itertools
import operator
results = []
for k, g in itertools.groupby(enumerate(my_list), lambda (i,x):i-x):
        group = map(operator.itemgetter(1), g)
        results.append(group)

有没有办法在上述解决方案中纳入我的额外要求?如果没有,解决问题的最佳方法是什么?


问题答案:

如有疑问,您可以随时编写自己的生成器:

def group_runs(li,tolerance=2):
    out = []
    last = li[0]
    for x in li:
        if x-last > tolerance:
            yield out
            out = []
        out.append(x)
        last = x
    yield out

演示:

list(group_runs(my_list))
Out[48]: [[0, 1, 2, 3, 5, 6], [10, 11], [15, 16, 18, 19, 20]]


 类似资料:
  • 问题内容: 所以,我有一张表,上面有这样的行: 每次扫描警报时(即每次触发或清除警报时)都会添加“已扫描的警报”行。任何警报都会添加带有特定Ev_Custom1的行。第一列Ev_Message包含一个计算机ID,该ID使我可以将警报与其他计算机分开。(您不喜欢任意的列名吗?)超过900条独特的警报消息。 我希望查询返回的内容是这样的: 这将是两个日期之间过滤的查询。我可以更改进入表的数据,但是有9

  • 问题内容: 我正在将CSV插入表中。我对CSV中的内容没有任何控制,很多字段为空白。例如,在我的第一条记录中,“ baths_full”字段为空(两个逗号背对背)。 在运行MySQL 5.5.37的生产服务器上,它将带​​有的记录插入为空字段。在运行MySQL 5.6.19的本地计算机上,出现以下错误: 奇怪的是,表的架构是相同的。实际上,我使用生产机器的导出来创建本地数据库。 该字段设置为Tin

  • 问题内容: 我有一个包含类别,日期和费率的表。每个类别在不同日期可以具有不同的费率,一个类别在给定日期只能具有一个费率。 唯一索引(类别,日期,费率)我希望针对每个类别将所有连续的日期范围归为一组,并仅保留范围的开始和结束。对于前面的示例,我们将有: 我在论坛中找到了一个类似的解决方案,但并未完全给出结果 请参见SQL FIDDLE 如何在mysql中做同样的事情?请帮忙! 问题答案: MySQL

  • 问题内容: 我如何返回在MySQL中实际上是“连续的” GROUP BY。换句话说,GROUP BY是否尊重记录集的顺序? 例如,从下表中,col1是唯一的有序索引: 返回: 但我需要返回以下内容: 问题答案: 采用: 这里的关键是创建一个允许分组的人为值。 以前,更正了Guffa的答案:

  • 问题内容: 我在DataFrame中有一列带有值: 如何将它们这样分组? 问题答案: 你可以groupby通过自定义使用:

  • 我有一个大的csv文件,其中包含以下格式的数据。 CityId1,名称,地址,........., zip 城市2、姓名、地址等,。。。。。。。,拉链 CityId1,名称,地址,........., zip ......... 城市名称、姓名、地址等,。。。。。。。,拉链 我正在对上面的csv文件执行以下操作: > df1。groupBy($“cityId”)。agg(收集列表(结构(cols.