在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))