【问题标题】:Negative values in a certain range一定范围内的负值
【发布时间】:2021-12-13 09:21:21
【问题描述】:

给定一个列表:

a = [-20,-15,-10,-5,0]

还有一个:

b = [-3,-10,-14,-19,-13,-5,-0.5]

我现在想要一个如下所示的结果字典:

N = {'-20 to -15': [-19], '-15 to -10': [-14,-13,-10], '-10 to -5': [-3,-5], '-5 to 0': [-0.5]} 

现在的问题是我已经无法正确检查“范围”。有人可以帮我解决代码中的错误吗?我试图通过 while 循环获取索引:

j=0
while j < len(a):
   index1 = next(x[0] for x in enumerate(b) if x[1] >= a[j])          
   index2 = next(x[0] for x in enumerate(b) if x[1] < a[j+1])
   j=+1

至少我认为,比较负值似乎存在某种问题。非常感谢您的帮助!

【问题讨论】:

  • 提示:你认为j=+1 做了什么?
  • -3如何在-10到-5的范围内?

标签: python next enumerate


【解决方案1】:

字典理解中的列表理解应该这样做:

>>> {f"{i} to {j}": [x for x in b if i < x <= j] for i, j in list(zip(a, a[1:]))}
{'-20 to -15': [-19], '-15 to -10': [-10, -14, -13], '-10 to -5': [-10, -5], '-5 to 0': [-3, -5, -0.5]}

解释:

  • list(zip(a, a[1:])):将范围生成为元组列表
  • [x for x in b if i &lt;= x &lt;= j]:生成给定范围内的值列表
  • f"{i} to {j}": 格式化字典键

【讨论】:

  • @7Programmer 请注意,这是一个问题的二次解,可以通过对b 进行排序并在收集间隔的项目后对其进行迭代,在对数线性时间内完成。
  • @user2390182 没错。我不确定他们是否想保留原始订单,因为从问题的预期输出中不清楚。您应该将其发布为答案。
  • 添加了一个答案,尽管除非数据量变得相当大,否则不太可能产生太大影响。
【解决方案2】:

您的代码示例根本不会产生您期望的结果。 恐怕您不知道您正在使用的功能产品是什么(nextenumerate)。

但这里是产生预期结果的简单代码:

a = [-20,-15,-10,-5,0]
b = [-3,-10,-14,-19,-13,-5,-0.5]

result = {}

for index, value in enumerate(a[:-1]):
    key = f"{value} to {a[index+1]}"
    result_value = [x for x in b if x >= value and x <= a[index+1]]
    result[key] = result_value

print(result)

【讨论】:

    【解决方案3】:

    这将为您提供范围内的列表:

    a = [-20,-15,-10,-5,0]
    b = [-3,-10,-14,-19,-13,-5,-0.5]
    interval = range(0, -25, -5)
    
    for i in range(len(interval) - 1):
    
        lower = interval[i+1]
        higher = interval[i]
    
        print ([x for x in a if x >= lower and x < higher])
        print ([x for x in b if x >= lower and x < higher])
    

    您只需要应用一些格式。

    【讨论】:

      【解决方案4】:

      您可以使用单个字典和列表理解来完成此操作。您可以创建要使用的字典,并在其中循环 b 以包含您想要的值。

      为了做到这一点,您还需要一个您想要的低值和高值列表。通过偏移 a 并将其与自身压缩,您可以创建该列表。

      {f'{low} to {high}':[num for num in b if (num>low and num<=high)] for low, high in zip(a, a[1:])}
      

      【讨论】:

        【解决方案5】:

        下面的代码非常简单。它提供了所需的输出。

        a = [-20,-15,-10,-5,0]
        b = [-3,-10,-14,-19,-13,-5,-0.5]
        a = sorted(a)
        b = sorted(b)
        out = {}
        for i in range(len(a)-1):
            first = a[i]
            last = a[i+1]
            key = "{} to {}".format(first, last)
            out[key] = []
            for j in b:
                if j >= first and j <= last:
                    out[key].append(j)
        print(out)
        

        【讨论】:

          【解决方案6】:

          其他人提出了二次方法,但这可以在对数线性时间内完成(为简单起见,我使用地板除以 5 自动生成边界):

          from itertools import groupby
          
          result = {}
          for k, g in groupby(sorted(b), key=lambda n: (n-1)//5):
              result[f"{5*(k)} to {5*(k+1)}"] = [*g]
          
          result
          # {'-20 to -15': [-19], '-15 to -10': [-14, -13, -10], 
          #  '-10 to -5': [-5], '-5 to 0': [-3, -0.5]}
          

          【讨论】:

            【解决方案7】:

            您可以使用类似于pairwise() itertools 配方和dictionary comprehension 的辅助函数来执行此操作:

            def pairwise(iterable):
                """s -> (s0,s1), (s1,s2), (s2, s3), ..."""
                a, b = iter(iterable), iter(iterable)
                next(b, None)
                return zip(a, b)
            
            a = [-20,-15,-10,-5,0]
            b = [-3,-10,-14,-19,-13,-5,-0.5]
            b = sorted(b)
            n = {f'{lo} to {hi}': [val for val in b if lo < val <= hi]
                    for lo, hi in pairwise(a)}
            print(n)
            

            输出:

            {'-20 to -15': [-19], '-15 to -10': [-14, -13, -10], '-10 to -5': [-5], '-5 to 0': [-3, -0.5]}
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-12-15
              • 2013-04-30
              • 1970-01-01
              • 2019-02-12
              • 1970-01-01
              相关资源
              最近更新 更多