1

我有两个列表都包含数字,我想检查一个列表中的数字是否是另一个列表中每两个数字之间的数字?“其他”列表具有有序数字,因此每两个数字是一个区间,如 234、238、567、569、2134、2156。

ListA = [200, 765, 924, 456, 231]

ListB = [213, 220, 345, 789, 12, 45]

我想检查 ListA[0:] 是否是 ListB[0:1] 或 [2:3] 等之间的数字。

我试过这个:

for i in range(0,len(ListB), 2):
    for x in ListA:
        if i < x < (i:i+2):
            print 'within range'

但是我收到“i:i + 2”的语法错误:(

4

3 回答 3

4

如果您要做的是确保列表 A 中的所有项目都在列表 B 中的至少一个间隔内:

>>> listA = [200, 765, 924, 456, 231]
>>> listB = [213, 220, 345, 789, 12, 45]

>>> intervals = zip(*[listB[i::2] for i in range(2)])

>>> [any(low < x < high for low, high in intervals)
                    for x in listA]
[False, True, False, True, False]
于 2012-12-18T19:10:16.887 回答
2

认为这就是您想要的,尽管还不是很清楚:

for i in range(0, len(ListB), 2):
    for x in ListA:
        if ListB[i] < x < ListB[i+1]:
            print 'within range'

你的直觉是对的,你可以i:i+2代表一个“范围”,但不完全是这样。该语法只能在切片 a 时使用listListB[i:i+2]返回一个只有 2 个元素的较小列表,[ListB[i], ListB[i+1]]正如您所期望的那样,但i:i+2其本身是非法的。(如果你真的想要,你可以写出slice(i, i+2)你的目标,但这在这里并不是那么有用。)

此外,根据您的描述,您希望与xListB[i]和进行比较ListB[i+1],而不仅仅是代码中的ii+1

如果你想使用切片来生成一个范围,你可以这样做,但只是间接的,而且在大多数方面它实际上会更笨拙和更糟糕:

for i in range(0, len(ListB), 2):
    brange = range(*ListB[i:i+2])
    for x in ListA:
        if x in brange:
            print 'within range'

但这是检查半开范围而不是开范围,它需要创建表示范围的列表,并遍历整个事物,它只适用于整数。所以,这可能不是你想要的。最好只明确使用ListB[i] < x < ListB[i+1].

您可能想考虑是否有一种更易读的方法来构建从ListB. 在还不了解itertools和列出推导式或生成器表达式(我假设)的情况下,您可能不得不写一些非常冗长和明确的东西,但无论如何它可能是有用的练习。

于 2012-12-18T19:04:22.053 回答
0
for i in range(0,len(ListB)-1, 2): #offest 1 less than the length
    for x in ListA:
        if ListB[i] < x < ListB[i+1]: #check if it is between ListB's elements
            print 'within range'

至少假设我明白你想要什么......

于 2012-12-18T19:04:09.743 回答