【问题标题】:Length of sequences of numbers greater than x in a list列表中大于 x 的数字序列的长度
【发布时间】:2019-07-09 08:40:16
【问题描述】:

我需要检索序列的长度,这些数字都大于任意选择的值x(某种“严重性”)。

一个序列可以是例如:

list = [4, 3, 4, 5, 2, 5, 6, 5, 5, 6, 7, 6 ]

在这种情况下,场景可能是:

x=6
[1, 3] # since there are only two sequences with values greater than 6 (the 6 alone, and the triplet 6,7,6]

问题类似于:Python: determine length of sequence of equal items in list,仅适用于等号序列。

出于这个原因,在我的“草稿”中,我从列表的最大数量开始(在前面的场景中 x=7),然后用较低的替换它并找到这些序列的长度(将所有 7 替换为6 并运行相同的算法来找到至少为 6) 的序列长度。

没有普通循环的pythonic方法是什么?

【问题讨论】:

  • 一个简单明了的for 循环应该不会太难编码。你试过吗?
  • 那么您是否尝试改编该代码以满足您的目的?你不应该只是期望它会交给你。
  • @jonrsharpe 我不想要代码,我想知道是否存在更好的方法来构建算法。我已经解决了这个问题,从最大严重性开始,迭代地减少一个单位,这样我就得到了正确数量的模式长度。你要我发这个吗?正如我所说,灵感来自于寻找具有相同唯一值的模式长度的类似问题
  • @Ev.Kounis 可能我应该添加我正在为大约 2000 个文件执行此操作,所以我仍然更喜欢非 for 循环选项。但是,是的,你是对的。我想知道是否有办法以这种方式使用 groupby,但我不认为
  • 那我不清楚你在问什么。您是否试图确定 x 的适当值?依据是什么?

标签: python algorithm data-structures


【解决方案1】:

我会这样做,以使步骤更具可读性。也许不是最优雅的解决方案,但只需要基本的列表理解和字符串函数。

list = [0 if el < 6 else el for el in list]
str = ''.join(str(el) for el in list)
sequences = [seq for seq in str.split('0') if seq is not '']
lengths = [len(seq) for seq in sequences]

【讨论】:

  • 这是一个像我一样迭代替换最大数字的神器,但是谢谢,我会测试哪个是最有效的
  • 我认为为了实现高效的实现,您应该考虑使用 numpy。
【解决方案2】:

使用 groupby 的另一种方法:

from itertools import groupby

data = [4, 3, 4, 5, 2, 5, 6, 5, 5, 6, 7, 6 ]
x = 6

out = [len(list(group)) for larger, group in groupby(elem >= x for elem in data) if larger]

此方法的工作原理是根据布尔比较 elem &gt;= x 对值进行分组,然后在列表推导中记录组的长度。

【讨论】:

    【解决方案3】:

    你可以使用itertools.groupby:

    from itertools import groupby
    
    data = [4, 3, 4, 5, 2, 5, 6, 5, 5, 6, 7, 6 ]
    x = 6
    
    out = [sum(1 for _ in group) for is_larger, group in groupby(data, lambda value: value>=x) if is_larger]
    print(out)
    #[1, 3]
    

    groupby 根据条件value &gt;= x 对值进行分组,这成为键is_larger

    我们只保留is_largerTrue 的组,对于这些组,我们使用sum(1 for _ in group) 获取它们的长度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 2018-10-24
      • 2019-01-19
      相关资源
      最近更新 更多