【问题标题】:Best way to split this list into smaller lists?将此列表拆分为较小列表的最佳方法?
【发布时间】:2014-03-09 00:45:56
【问题描述】:

我一直在努力思考将这个数字列表拆分的最佳方法,这些数字列表是有序的,但又分成几部分。例如:

data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 29, 30, 31, 32, 33, 35, 36, 44, 45, 46, 47]

我希望输出是这样的..

sliced_data = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],[29, 30, 31, 32, 33],[35, 36],[44, 45, 46, 47]]

我一直在尝试一段时间,直到它为空,但效果不太好..

编辑:

for each_half_hour in half_hour_blocks:
    if next_number != each_half_hour:
        skippers.append(half_hour_blocks[:next_number])
        del half_hour_blocks[:next_number]

    next_number = each_half_hour + 1

【问题讨论】:

  • 有什么不好用的?
  • 它挂在一个循环中。我会发布它。

标签: python list split enumerate


【解决方案1】:
>>> data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 29, 30, 31, 32, 33, 35, 36, 44, 45, 46, 47]
>>> from itertools import groupby, count
>>> [list(g) for k,g in groupby(data, key=lambda i, c=count():i-next(c))]
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [29, 30, 31, 32, 33], [35, 36], [44, 45, 46, 47]]

【讨论】:

    【解决方案2】:

    我不明白为什么 while-loop 在这里不起作用,除非你想要更高效或更简洁的东西。

    类似:

    slice = [data.pop(0)]
    sliced_data = []
    while data:
        if data[0] == slice[-1] + 1:
            slice.append(data.pop(0))
        else:
            sliced_data.append(slice)
            slice = [data.pop(0)]
    sliced_data.append(slice)
    

    【讨论】:

    • 两个非常棒的答案,它帮助我解决了我的错误。为了可读性,我将使用 tijko's。
    • @Matthew,这种方法不能很好地扩展到大型列表,所以如果data 并不总是很短,请记住这一点
    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 2012-11-04
    • 2010-10-19
    • 1970-01-01
    • 2010-12-11
    • 2020-05-05
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多