【问题标题】:How to split the list based on the value of the elements [duplicate]如何根据元素的值拆分列表[重复]
【发布时间】:2021-11-11 03:05:32
【问题描述】:

我有一个值列表

lst = [75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 185, 186, 187, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 221, 222, 223, 224, 225, 226, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 309, 310, 311, 312, 313, 314, 315, 316, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 401, 402, 403, 404, 405, 406, 407, 408, 439, 440]

如果您仔细查看列表,您会发现值在递增,然后出现大幅跳跃,然后值再次开始递增。

我怎样才能分到最后才能拥有

[[75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88], [118, 119, 120, 121, 122, 123, 124, 125, 126, 127], [155, 156, 157, 158, 159, 160, 161, 162, 163, 164]...[439, 440]]

【问题讨论】:

标签: python data-structures


【解决方案1】:

这是itertools 的解决方案。我用作保持连续数字的条件(感谢@KarlKnechtel)。

from itertools import groupby
diff = [item - i for i, item in enumerate(lst)]
[[x[1] for x in g] for i,g in groupby((zip(diff,lst)), lambda x: x[0])]

输出:

[[75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88],
 [118, 119, 120, 121, 122, 123, 124, 125, 126, 127],
 [155, 156, 157, 158, 159, 160, 161, 162, 163, 164],
 [185, 186, 187, 188, 189, 190, 191, 192, 193],
 [195, 196, 197, 198, 199],
 [221, 222, 223, 224, 225, 226],
 [273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283],
 [309, 310, 311, 312, 313, 314, 315, 316],
 [371, 372, 373, 374, 375, 376, 377, 378, 379, 380],
 [401, 402, 403, 404, 405, 406, 407, 408],
 [439, 440]]

【讨论】:

  • 真的比我的hack好。 +1
  • 我们不需要比较相邻元素来解决问题。根据@don't talk just code 发现的潜在重复,考虑如果从值中减去 索引 会发生什么:diff = [item - i for i, item in enumerate(lst)]。您应该会发现,之后可以为groupby 写一个更简单的key
  • @KarlKnechtel 感谢您的好评,我更新了答案:)
  • 使用与enumerate 相同的逻辑,但由于more_itertools.groupby_transform 是单行的:[g for k,g in more_itertools.groupby_transform(enumerate(lst), keyfunc=lambda p: p[1]-p[0], valuefunc=operator.itemgetter(1), reducefunc=list)]
  • 其实你的解决方案和more_itertools.consecutive_groups的源码几乎一模一样:more-itertools.readthedocs.io/en/stable/_modules/more_itertools/…
【解决方案2】:

试试:

data = []
tmp = []
for i, j in zip(lst[:-1], lst[1:]):
    if j - i > 1:
        data.append(tmp)
        tmp = []
    else:
        tmp.append(i)
data.append(tmp + [lst[-1]])

输出:

>>> data
[[75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87],
 [118, 119, 120, 121, 122, 123, 124, 125, 126],
 [155, 156, 157, 158, 159, 160, 161, 162, 163],
 [185, 186, 187, 188, 189, 190, 191, 192],
 [195, 196, 197, 198],
 [221, 222, 223, 224, 225],
 [273, 274, 275, 276, 277, 278, 279, 280, 281, 282],
 [309, 310, 311, 312, 313, 314, 315],
 [371, 372, 373, 374, 375, 376, 377, 378, 379],
 [401, 402, 403, 404, 405, 406, 407],
 [439, 440]]

【讨论】:

【解决方案3】:
ans = [[]]
for a, b in zip(lst[:-1], lst[1:]):
    ans[-1].append(a)
    if b-a > 1:
        ans .append([])
ans[-1].append(lst[-1])

我们正在检查蛮力,然后制作新列表并将其附加到另一个父列表。

【讨论】:

    猜你喜欢
    • 2020-08-28
    • 1970-01-01
    • 2020-06-08
    • 2023-01-26
    • 2019-03-06
    • 2018-12-22
    • 1970-01-01
    • 2021-03-18
    • 2021-01-30
    相关资源
    最近更新 更多