0

それぞれが多数のタプルを含む 2 つのセットがあります。

s1 = set([('a','b','c'), ('d','e','f'), ('g','h','i'), ('j','k','l'), ('m','n','o')])
s2 = set([('a','y','z'), ('p','q','r'), ('s','t','u'), ('v','w','x')])

各タプルには、いくつかの文字列 (この場合は 3) が含まれます。また、各タプルには最初の要素である id があります。両方のセットで同じ id を持っているが、s1 の (a,b,c) と s2 の (a,y,z) のような次の値が異なるタプルを確認し、これを出力します。

in を使用してセットに含まれているかどうかを確認するために正確なタプルが必要ですか?次に、このタプルにアクセスして印刷するにはどうすればよいですか?

4

6 に答える 6

2

in を使用してセット内にあるかどうかを確認するには、正確なタプルが必要ですか

そうです。アイテムの一部のみを比較する必要がある場合は、 を使用dictして、比較可能な部分をキーにし、残りを値にします。

サンプルコードから始めて、

d1 = dict((x[0], x) for x in s1)
# similarly, make d2 from s2

次に、 をチェックしたりa in d1、関連するトリプルを で取得したりできますd1[a]

于 2012-07-12T09:16:42.147 に答える
1

dictセットをs に変換すると、検索が容易になると思います。

>>> d1 = {t1[0]: (t1[1], t1[2]) for t1 in s1}
>>> d1
{'a': ('b', 'c'), 'j': ('k', 'l'), 'm': ('n', 'o'), 'd': ('e', 'f'), 'g': ('h', 'i')}
>>> d2 = {t2[0]: (t2[1], t2[2]) for t2 in s2}
>>> d2
{'a': ('y', 'z'), 'p': ('q', 'r'), 's': ('t', 'u'), 'v': ('w', 'x')}
>>> [(k2, d2[k2]) for k2 in d2 if k2 in d1 and d2[k2] != d1[k2]]
[('a', ('y', 'z'))]
于 2012-07-12T09:22:09.917 に答える
0

id を dict のキーとして使用して、セットを dict に変換します。

s1d = {}
for e in s1:
  s1d[e[0]] = e

それなら簡単なはずです。

于 2012-07-12T09:17:16.637 に答える
0

set の代わりに aを使用してdict、アイテムを ID で保存します。

def byid(tups):
    for t in tups:
        # yield key, value paris
        yield t[0], tuple(t[1:])

# make a dict from the pairs
seen = dict(byid(s1))

for key, vals in byid(s2):
    # now it's easy to find duplicates
    if key in seen:
        print seen[key], "vs", vals
于 2012-07-12T09:20:45.520 に答える
0

次のようなものが機能します。

for x in s1:
   templist = [y for y in s2 if y[0] == x[0] and x[1:] != y[1:]]
   if len(templist):
      print x,
于 2012-07-12T09:19:08.203 に答える
0

@MartijnPieters が言ったように、辞書を使用する必要があります。

解決策として@larsmansによる方法があります。

>>> s1 = set([('a','b','c'), ('d','e','f'), ('g','h','i'), ('j','k','l'), ('m','n','o')])
>>> s2 = set([('a','y','z'), ('p','q','r'), ('s','t','u'), ('v','w','x')])
>>> d1 = dict((i, (a, b)) for i, a, b in s1)
>>> d2 = dict((i, (a, b)) for i, a, b in s2)
>>> [(k, d1[k], d2[k]) for k in set(d1).intersection(d2) if d1[k] != d2[k]]
[('a', ('b', 'c'), ('y', 'z'))]
于 2012-07-12T09:19:57.283 に答える