2

我有一个 ID 范围的元组列表,例如,

[(0,2), (3,6), (7,10), (11,14), (15,21), etc.]

另外,我有多个 ID 整数列表,例如,

[1, 2, 4, 11, 12, 15, 17, 20, 22, 24, ...], [2, 3, 5, 10, 13, 15, 18, 20, 23, 24, ...], etc. 

列表的长度不一定相同。

我正在寻找一种更好的方法来返回在其范围内的每个列表中至少有一个整数的元组,例如,列表一中的“1”和列表二中的“2”匹配元组列表 [0](范围 0 -2) 或列表一中的“11”和列表二中的“13”匹配元组列表 [3](范围 11-14)。

我可以循环遍历元组和列表,但是对于大型列表来说这很麻烦而且速度很慢。有没有更高效、更简洁的方法?

4

2 回答 2

1
tups = [(0,2), (3,6), (7,10), (11,14), (15,21), (600,612)]
int_list = [[1, 2, 4, 11, 12, 15, 17, 20, 22, 24], [2, 3, 5, 10, 13, 15, 18, 20, 23, 24]]

for a,b in tups:
    f = set(range(a,b+1))
    if all(f.intersection(x) for x in int_list):
        print (a,b)

使用设置交集,您应该能够得出您的答案:

(0, 2)
(3, 6)
(11, 14)
(15, 21)

其范围在所有列表中由至少一个匹配整数表示的所有元组。

说明:每个元组都被转换成一个包含范围。依次检查每个范围与生成器中所有可能列表的交集。如果任何元组与列表没有交集,则 all() 继续下一个元组。如果一个元组与所有列表有交集,则 all() 返回 true,并且将元组 (a,b) 返回给用户。

于 2013-05-22T16:50:47.080 回答
1

使用 bisect 模块,我们可以检查元组范围内的数字是否存在于给定列表中,方法是查看元组的两个成员是否会插入到该列表中的不同索引中,同时保持排序顺序。这假定列表已排序,但元组可以按任意顺序排列。

tups=[(2,0), (3,6), (7,10), (11,14), (15,21)]
lis=[[1, 2, 4, 11, 12, 15, 17, 20, 22, 24],
[2, 3, 5, 10, 13, 15, 18, 20, 23, 24]]
from bisect import bisect
print [(x,y) for x,y in tups if all((bisect(li,x) != bisect(li,y)) or (x in li or y in li) for li in lis)]
于 2013-05-22T15:50:45.403 回答