如何为Python中的“in”关键字指定自定义比较器?

时间:2012-03-27 22:26:55

标签: python python-2.7 python-2.x

我对Python很新,所以我欢迎其他方法。

我有一个我开头的词典列表(从文件中读取)。 现在我有一堆额外的词典,我想添加到此列表中,但前提是它们不在原始列表中。

但是,我要求“不在原始列表中”由自定义比较函数定义,而不是Python默认使用的任何内容。

更具体地说,我想比较字典中的某些键/值对,如果它们相同,则为表达式返回“true”。

myList = ReadFromFile...
newList = ReadFromFile...
for item in newList:
    if item not in myList: #I want custom behavior for this "in"
        myList.append(item)

4 个答案:

答案 0 :(得分:9)

使用any

any(customEquals(item, li) for li in myList)

如果myClass属于您可以控制的类型,您也可以覆盖__contains__方法。

答案 1 :(得分:2)

你没有。 in运算符是语言语法的一部分。你想做的是这样的:

def comparison(item, otherContainer):
  # Code here for custom comparison.
  return True or False

for item in NewList:
  if not comparison(item, myList):
    myList.append(item)

答案 2 :(得分:1)

要解决您对g.d.d.c的回答的评论:

如果您的值是可清除的(粗略地说,这意味着它们是不可变的),最有效的可能是使用Python的集合。阅读myList后,从myList生成一组感兴趣的值。 (如果我正确地阅读了您的问题,您将拥有一组从myList生成的元组。)然后,当您循环newList时,您可以测试成员资格(再次,感兴趣的值) )针对该集合,每次测试为O(1),产生的算法复杂度为O(m + n)。

您可能希望使用operator.itemgetter来获取感兴趣的值。

答案 3 :(得分:1)

如果你需要一个(object, object) --> bool类型的功能来测试遏制,那么已经有one in the standard lib

from operator import contains

myList = ReadFromFile...
newList = ReadFromFile...
for item in newList:
    if not contains(myList, item):
        myList.append(item)