0

这里的新手试图在另一个子列表中搜索一个子列表的一部分。

list_1 = [[1, 2, 9], [4, 5, 8]]
list_2 = [[1, 2, 3], [4, 5, 6], [1, 2, 5]]

for item in list_1:
    for otherItem in list_2:
        item[0:2] in otherItem[0:2]

我希望这会回来

True
False
True
False
True
False

但相反,我每次迭代都会出错。简而言之:

list_1[0][0:2] == list_2[0][0:2] #this returns true
list_1[0][0:2] in list_2[0][0:2] #this returns false

我想我不明白它是如何in工作的。有人可以在这里教我吗?

4

3 回答 3

6

in查看一个子列表是否是另一个列表的元素(不是子列表):

[1,2] in [[1,2],[3,4]]

将是True

[1,2] in [1,2,3]

会是False这样:

[1,2] in [1,2]

然而:

[1,2] == [1,2]

将是True。根据您实际尝试执行的操作,set对象可能很有用。

a = [1,2]
b = [1,2,3]
c = [3,2,1]
d = [1,1,1]
e = set(a)
len(e.intersection(b)) == len(a)  #True
len(e.intersection(c)) == len(a)  #True -- Order of elements does not matter
len(e.intersection(d)) == len(a)  #False
于 2013-02-28T19:29:29.517 回答
2

鉴于您的示例列表:

list_1 = [[1, 2, 9], [4, 5, 8]]
list_2 = [[1, 2, 3], [4, 5, 6], [1, 2, 5]]

这有效:

print [this[0:2]==that[0:2] for this in list_1 for that in list_2]
[True, False, True, False, True, False]

或者,使用一组:

print [this for this in list_1 for that in list_2 if set(this[0:2])<set(that)]
[[1, 2, 9], [1, 2, 9], [4, 5, 8]]

请注意,集合是无序的,因此:

>>> set([1,2])==set([2,1])
True

的典型用法in是字符串:

>>> 'ab' in 'cbcbab'
True

或序列中的单个元素:

>>> 100 in range(1000)
True

或序列中的一个原子元素:

>>> (3,3,3) in zip(*[range(10)]*3)
True

但是重叠列表元素不起作用:

>>> [1,2] in [0,1,2,3]
False

除非元素的原子大小相同:

>>> [1,2] in [0,[1,2],3]
True

但是您可以使用字符串来比较列表 a 是否在列表 b 中,如下所示:

>>> def stringy(li): return ''.join(map(str,li))
...
>>> stringy([1,2,9][0:2])
'12'
>>> stringy([1,2,9][0:2]) in stringy([1,2,5])
True

因此,您的初衷可能是检查是否item[0:2]出现在otherItem循环中的任何地方,但按“项目”的顺序。您可以使用这样的字符串:

>>> print [this for this in list_1 for that in list_2 if stringy(this[0:2]) in stringy(that)]
[[1, 2, 9], [1, 2, 9], [4, 5, 8]]

这与 set 版本不同'12'!='21''12' not in '21' 因此如果您更改了 list_2 的元素顺序:

list_1 = [[1, 2, 9], [4, 5, 8]]
list_2 = [[1, 2, 3], [4, 5, 6], [1, 5, 2]]

print [this for this in list_1 for that in list_2 if set(this[0:2])<set(that)]
[[1, 2, 9], [1, 2, 9], [4, 5, 8]]   # same answer since sets are unordered
print [this for this in list_1 for that in list_2 if stringy(this[0:2]) in stringy(that)]
[[1, 2, 9], [4, 5, 8]]              # different answer...
于 2013-02-28T19:35:21.457 回答
1
print set([1,2]).intersection([1,2,3])==set([1,2])

将会True

使用设置交集我认为你可以得到你想要的

需要注意的是,集合是无序集合的唯一元素

因此set([1,1,2]) == set([1,2]) ,这可能不一定适用于所有情况

于 2013-02-28T19:32:39.490 回答