python 一定范围内的负值

wgxvkvu9  于 2023-06-04  发布在  Python
关注(0)|答案(7)|浏览(133)

给出一个列表:

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

似乎有一个问题,不知何故与比较的负值,至少我认为。我将非常感谢帮助!

d7v8vwbk

d7v8vwbk1#

字典解析中的列表解析应该做到这一点:

>>> {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 <= x <= j]:生成给定范围内的值列表
  • f"{i} to {j}":格式化字典键
ikfrs5lh

ikfrs5lh2#

您的代码示例根本不会产生您所期望的结果。恐怕你不知道你使用的函数的乘积是什么(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)
42fyovps

42fyovps3#

这将为您提供范围列表:

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])

你只需要使用一些格式。

llycmphe

llycmphe4#

你可以用一个字典和列表解析来实现这一点。你可以创建你想要使用的字典,并在其中循环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:])}
ryoqjall

ryoqjall5#

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

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)
suzh9iv8

suzh9iv86#

其他人提出了二次方法,但这可以在对数线性时间内完成(为了简单起见,我使用地板除以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]}
u91tlkcl

u91tlkcl7#

你可以使用一个类似于pairwise() itertools的helper函数和一个字典理解来完成它:

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]}

相关问题