0

我有两组,每组包含许多元组:

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

我认为将您的集合转换为dicts 会简化搜索:

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

像这样的东西可以工作:

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

将您的集合转换为字典,使用 id 作为字典的键:

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

那么它应该很容易。

于 2012-07-12T09:17:16.637 回答
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 回答
0

您想使用 adict而不是 set 按 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 回答