1

Pythonタプルで一定の違いを行う必要がありますが、違いは私のタプルの最初の要素を考慮する必要があります。

これを達成するために、私はこのクラスのアプローチを使用して(失敗して)行いました

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

しかし、私はこれで何も役に立つことができませんでした。

4

2 に答える 2

5

__eq__()これを行う唯一の方法は、との最初の要素のみを使用する独自のシーケンスクラスを定義すること__hash__()です。

于 2012-04-11T01:35:08.593 に答える
0

少し遅れますが、ここに別の方法があります。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))
于 2012-04-11T03:12:08.850 に答える