一定范围内的负值
Negative values in a certain range
给定一个列表:
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
比较负值似乎有点问题,至少我认为是这样。非常感谢您的帮助!
字典推导中的列表推导应该可以做到:
>>> {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}"
: 格式化字典键
这将为您提供以下范围内的列表:
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])
您只需应用一些格式。
您可以使用单个字典和列表推导来完成此操作。您可以创建要使用的字典,并在其中循环遍历 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:])}
下面的代码非常简单。它给出了所需的输出。
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)
您的代码示例根本不会产生您期望的结果。
恐怕,您不知道您正在使用的函数的乘积是什么(next
和 enumerate
)。
但这里是产生预期结果的简单代码:
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)
其他人提出了二次方法,但这可以在对数线性时间内完成(为简单起见,我使用 floor 除以 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]}
您可以使用类似于 pairwise()
itertools recipe and a 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]}
给定一个列表:
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
比较负值似乎有点问题,至少我认为是这样。非常感谢您的帮助!
字典推导中的列表推导应该可以做到:
>>> {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}"
: 格式化字典键
这将为您提供以下范围内的列表:
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])
您只需应用一些格式。
您可以使用单个字典和列表推导来完成此操作。您可以创建要使用的字典,并在其中循环遍历 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:])}
下面的代码非常简单。它给出了所需的输出。
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)
您的代码示例根本不会产生您期望的结果。
恐怕,您不知道您正在使用的函数的乘积是什么(next
和 enumerate
)。
但这里是产生预期结果的简单代码:
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)
其他人提出了二次方法,但这可以在对数线性时间内完成(为简单起见,我使用 floor 除以 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]}
您可以使用类似于 pairwise()
itertools recipe and a 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]}