Python检查对象是否在对象列表中

Joh*_*ohn 19 python

我在Python中有一个对象列表.然后我有另一个对象列表.我想浏览第一个列表,看看是否有任何项目出现在第二个列表中.

我以为我可以做到

for item1 in list1:
    for item2 in list2:
        if item1 == item2:
            print "item %s in both lists"
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不起作用.虽然我这样做:

if item1.title == item2.title:
Run Code Online (Sandbox Code Playgroud)

它工作正常.我有比这更多的属性,所以不要真的想做一个大的if语句比较所有的属性,如果我不需要.

任何人都可以给我帮助或建议我能做些什么来找到两个列表中出现的对象.

谢谢

Tam*_*más 31

假设您的对象只有一个title与相等性相关的属性,您必须__eq__按如下方式实现该方法:

class YourObject:
    [...]
    def __eq__(self, other):
        return self.title == other.title
Run Code Online (Sandbox Code Playgroud)

当然,如果您有更多与平等相关的属性,那么您也必须包含这些属性.您也可以考虑实施__ne____cmp__保持一致的行为.


aby*_*byx 9

如果对象不是同一个实例,则需要实现__eq__python 的方法,以便能够判断2个对象实际上是否相等.

当然,大多数库类型,例如字符串和列表已经__eq__实现,这可能是比较标题为你工作的原因(它们是字符串吗?).

有关更多信息,请参阅python文档.
这里是一个随机的例子进行__eq__.


YOU*_*YOU 5

集合交叉将为此做.

>>> x=[1,2,3,4]
>>> y=[3,4,5,6]
>>> for i in set(x) & set(y):
...     print "item %d in both lists" %i
...
item 3 in both lists
item 4 in both lists
Run Code Online (Sandbox Code Playgroud)

  • 我认为他的问题是对象平等,而不是发现:) (3认同)
  • OP具有对象列表,而不是原子类型列表.如果您使用没有定义`__hash__`的对象尝试您的代码,它将无法工作,就像OP的代码不适用于没有定义`__eq__`或`__cmp__`的对象列表. (3认同)