在python 2.7中,将cmp函数或键函数传递给集合差(或其他集合操作) 我需要对Python元组做一个设置差异,但是差异需要考虑元组的第一个元素。
为了实现这一点,我(毫不犹豫地)使用了这个类方法在python 2.7中,将cmp函数或键函数传递给集合差(或其他集合操作) 我需要对Python元组做一个设置差异,但是差异需要考虑元组的第一个元素。,python,set,Python,Set,为了实现这一点,我(毫不犹豫地)使用了这个类方法 class Filedata(object): def __init__(self, filename, path): self.filename = filename self.path = path + '\\' + filename def __eq__(self, other): return self.filename==other.filename def __n
class Filedata(object):
def __init__(self, filename, path):
self.filename = filename
self.path = path + '\\' + filename
def __eq__(self, other):
return self.filename==other.filename
def __ne__(self, other):
return self.filename!=other.filename
def __call__(self):
return self.filename
def __repr__(self):
return self.filename
深入研究sets.py模块,我发现该库使用itertools.ifilterfalse函数来实现差异
def difference(self, other):
"""Return the difference of two sets as a new Set.
(I.e. all elements that are in this set and not in the other.)
"""
result = self.__class__()
data = result._data
try:
otherdata = other._data
except AttributeError:
otherdata = Set(other)._data
value = True
for elt in ifilterfalse(otherdata.__contains__, self):
data[elt] = value
return result
但是我不能用它做任何有用的事情。唯一的方法是定义您自己的sequence类,它只使用
\uuuEq\uEq()
和\uHash\uEq()
中的第一个元素。唯一的方法是定义您自己的sequence类,它只使用\uEq\uEq()中的第一个元素
和\uuuuuu hash\uuuuu()
有点晚,但这里有一个替代方案。它将保留Set和dict的所有方法。请尝试以下方法:
有点晚了,但这里有一个替代方案。它将保留Set和dict的所有方法。请尝试以下方法:
令人惊叹的!非常感谢,太棒了!非常感谢你。
from sets import Set
from itertools import ifilterfalse
class MyDict(dict):
custom_list = None
def contains(self, a):
if not self.custom_list:
self.custom_list = [key[0] for key in self]
return a[0] in self.custom_list
def update_by_dict(self, _dict):
for key in _dict:
self[key] = _dict[key]
class MySet(Set):
def diff_by_first_item(self, other):
result = self.__class__()
data = result._data
try:
otherdata = other._data
except AttributeError:
otherdata = Set(other)._data
yetanother = MyDict()
yetanother.update_by_dict(otherdata)
value = True
for elt in ifilterfalse(yetanother.contains, self):
data[elt] = value
return result
if __name__ == "__main__":
a = [(0, 'a'), (1, 'b'), (2, 'c')]
b = [(1, 'c')]
print MySet(a).diff_by_first_item(b)
print MySet(a).diff_by_first_item(MySet(b))
print MySet(a).diff_by_first_item(set(b))