4

次の 2 つのリストがあります。

lst1 = [('vr1', '635', '1'), ('vr1', '32', '1'), ('vr1', '784', '0.526'), ('vr1', '431', '1')]

lst2 = [('vr1', '635', '3'), ('vr1', '784', '2.526'), ('vr1', '431', '2')]

lst1現在、次のコードで何が一意であるかを判断しています。比較は、すべてのエントリの最初の 2 列の内容に基づいて行われます。

uniq = set([i[0:2] for i in lst1]).difference([j[0:2] for j in lst2])

与える:

set([('vr1', '32')])

次に、完全なエントリを取得するために、lst1含まれている場合はすべてのエントリを検索します。uniq

uniq_full = [i for i in lst1 if i[0:2] in uniq]

これは、私が望む方法でエントリを返します。

[('vr1', '32', '1')]

私の質問は次のとおりです。完全なエントリを取得するより速い方法はありますか?

4

4 に答える 4

1

dictセットではなく単に s を使用します。

lst1 = [('vr1', '635', '1'), ('vr1', '32', '1'), ('vr1', '784', '0.526'), ('vr1', '431', '1')]
lst2 = [('vr1', '635', '3'), ('vr1', '784', '2.526'), ('vr1', '431', '2')]

d1 = {x[0:2]:x for x in lst1}
d2 = {x[0:2]:x for x in lst2}

for key in set(d1) - set(d2):
    print d1[key]   # ('vr1', '32', '1')

これがより速いかどうかはわかりませんが、より透明に見えます。

于 2013-10-25T09:38:01.993 に答える
0

Proxy パターンを使用して、最後の検索なしでこれを実現できます。

class Wrapper:
    def __init__(self, tuple):
        self.tuple = tuple

    def __eq__(self, other):
        return self.tuple[0:2] == other.tuple[0:2]

    def __ne__(self, other):
        return not self.__eq__(other)

    def __hash__(self):
        return 0

    def __str__(self):
        return str(self.tuple)

    def __repr__(self):
        return repr(self.tuple)

lst1 = [Wrapper(('vr1', '635', '1')), Wrapper(('vr1', '32', '1')), Wrapper(('vr1', '784', '0.526')), Wrapper(('vr1', '431', '1'))]

lst2 = [Wrapper(('vr1', '635', '3')), Wrapper(('vr1', '784', '2.526')), Wrapper(('vr1', '431', '2'))]

uniq = set(lst1) - set(lst2)

print uniq

与えます:

set([('vr1', '32', '1')])

thg435 の答えははるかに簡単です。私の唯一の利点は、で比較を構成できることですWrapper。ただし、速度については不明です。

于 2013-10-25T09:36:16.273 に答える