有关数字列表和间隔列表,请查找每个数字所在的时间间隔

时间:2016-01-04 13:34:20

标签: python

在字典中如下:

example = {'Chr3' : [[1, 4], [5, 10], [13, 17]]}

我怎么知道区号6和15位于哪个列表中?

我可以使用简单的for循环编写解决方案:

for key in example.keys():
    for element in example[key]:
        if element[0]<= 6 <= element[1] or element[0] <= 15 <= element[1]:
            print element

但在我真正的问题中,我不只有两个数字,而是一个数字列表。

所以,我在想是否有更多pythonic方式使用特殊列表或字典方法/函数来解决这个问题?

编辑: 由于投票不足,我澄清说我知道如何使用另一个循环编写代码以获取数字列表,我想知道是否有更好的解决方案来解决相同的问题,更有效率!

4 个答案:

答案 0 :(得分:2)

创建一个字典,将您的数字列表中的任意数字映射到example['Chr3']中的相应间隔。

>>> {x:filter(lambda y: y[0] <= x <= y[1], example['Chr3']) for x in lst}
{6: [5, 10], 15: [13, 17]}

答案 1 :(得分:1)

使用功能!

example = {'Chr3' : [[1, 4], [5, 10], [13, 17]]}
example_nums = [3, 6, 11, 15, 17]

def find_interval(dct, num):
    for key, values in dct.items():
        for left, right in values:
            if left <= num <= right:
                return [left, right]

print(find_interval(example, 6))
print(find_interval(example, 15))

# Now you can use the function to find the interval for each number
for num in example_nums:
    print(num, find_interval(example, num))

输出

[5, 10]
[13, 17]
3 [1, 4]
6 [5, 10]
11 None
15 [13, 17]
17 [13, 17]

https://repl.it/Bb78/4

答案 2 :(得分:0)

您能否显示列表的更具体示例?我认为你的代码可以通过在列表中包含循环行来实现:

for x in my list:
    for key in example.keys():
         for element in example[key]:
            if element[0]<= x <= element[1] or element[0] <= x <= element[1]:
                   print element

答案 3 :(得分:0)

您的代码会查找任何匹配而非多个匹配项,您可以使用带有any

的列表组合
from itertools import chain

pot = [6, 15]
print([[a, b] for a, b in  chain(*example.values()) if any(a <= i <= b for i in pot)])
[[5, 10], [13, 17]]

如果你只关心任何比赛,你只需要检查潜在数字的 min max

pot = [6, 15,7,9,8]
from itertools import chain

mn,mx = min(pot), max(pot)
print([[a, b] for a, b in  chain(*example.values()) if mn <= a <= mx or mn <= b <= mx])

[[5, 10], [13, 17]]

因此,您现在正在不断检查ab而非线性。

或者使用python3你可以使用范围并使用in这是python3中的O(1)操作:

pot = [6, 15,7,9,8]
mn ,mx = min(pot),  max(pot)
inter = range(mn, mx+1)
print([[a, b] for a, b in chain(*example.values()) if a in inter or b in inter])
[[5, 10], [13, 17]]