python - Pyhonic 使用 if 语句来处理应用于分块列表的不等式

标签 python list for-loop inequality

给定以下 Python 列表:

l1 = [0,1000,5000,10000,20000,30000,40000,50000] #8 values, 7 intervals
v1 = [1,2,3,4,5,6,7] #7 values
v2 = [a,b,c,d,e,f,g] #7 letters

我想检查一个数字是否包含在任何区间内,并根据这是哪个区间返回另一个值。

例子:

1. My test value is 1111
2. It belongs to the second interval: 1000 < 1111 < 5000
3. Hence I need to return b

我会通过以下方式解决问题:

  1. 创建 l1 的 block
  2. 迭代每个 block
  3. 为每个 block 写一个 if 语句
  4. 返回正确chunk对应的字母

我可以通过查看每一对连续的数字来创建它的 block :

def chunker(seq, size):
    return (seq[pos:pos + size] for pos in range(0, len(seq)))

for group in chunker(l1, 2):
   print(group)

返回:

[0, 1000]
[1000, 5000]
[5000, 10000]
[10000, 20000]
[20000, 30000]
[30000, 40000]
[40000, 50000]
[50000]

我的问题:

  1. 是否有一种 Pythonic 的方式来编写这些 if 语句而不是 每个 block 有一个?如果我有 1,000 个 block 怎么办?
  2. 如果有,如何在不为其创建特定案例的情况下处理最后一个 block ?

最佳答案

您可以只使用生成器来获取结果:

l1 = [0,1000,5000,10000,20000,30000,40000,50000]
v2 = ['a','b','c','d','e','f','g']

value = 1111

result = next((v for v, i, j in zip(v2, l1[:-1], l1[1:]) if value in range(i, j)), None)

输出:

>>> result
'b'

通过添加默认值 None 作为 next() 的第二个参数,您也可以处理未找到的情况:

value = -50

result = next((v for v, i, j in zip(v2, l1[:-1], l1[1:]) if value in range(i, j)), None)

>>> result
# None

如果你只是想要索引,你可以使用 enumerate 代替:

result = next((v for v, (i, j) in enumerate(zip(l1[:-1], l1[1:])) if value in range(i, j)), None)

>>> result
# 1

解释:

结果行由几部分组成:

next(iterator [, default])

这是一个函数,用于检索传入参数的 iterator 中的下一项。 default 用于在遇到 StopIteration 时返回默认值。有问题的 iterator 是这里的生成器(为清楚起见分解):

(
  v                                  # point 4
    for v, i, j                      # point 2
      in zip(v2, l1[:-1], l1[1:])    # point 1
    if value in range(i, j)          # point 3
)
  1. zip 函数整理传递的列表,以便v2[0]l1[: -1][0]l1[1:][0] 形成一个元组('a', 0, 1000),依此类推对于每个索引。

  2. for v, i, j 用于提取元组中的元素。

  3. if value in range(i, j) 用于检查 1111 是否在 range(0, 1000)< 之间的范围内

  4. 如果匹配,则返回 v。如果不是,则继续下一次迭代。

关于python - Pyhonic 使用 if 语句来处理应用于分块列表的不等式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58305998/

相关文章:

python - 解析 RSS feed 中的重复名称元素

python - Subprocess.Popen 中的 Python 程序错误

python - 加入单个 DataFrame 的两个唯一组合,将其转换为列名

javascript - for (var x in array) 和 for (var x=0, y= array.length; x<y; x++) 的性能差异

C++ - 如何从头到尾遍历列表?

python - 如何使用 python 制作盒须图

java - List.iterator() 是线程安全的吗?

python - 如何从 ctypes 数组中获取 ctypes 类型对象

list - 大于 X 的第一个元素的索引(Prolog)

python - 在 Jupyter Notebook 中调试 Python 代码的更好方法