Python集比较

时间:2012-07-12 09:10:38

标签: python comparison set

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

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)并输出它。

您是否必须使用确切的元组来检查它是否在使用中的集合中,以及如何访问此元组以将其打印出来?

6 个答案:

答案 0 :(得分:2)

  

你是否必须有确切的元组来检查它是否在

中的集合中

是的,你这样做。如果只应比较部分商品,请使用dict,将可比较的部分设为键,其余部分设为值。

从示例代码开始,

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

然后,您可以检查a in d1,使用d1[a]获取相关的三元组等。

答案 1 :(得分:1)

我认为将您的广告集转换为dict可以简化搜索:

>>> 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'))]

答案 2 :(得分:0)

使用id作为dict的键,将你的集转换为dict:

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

那应该很容易。

答案 3 :(得分: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,

答案 4 :(得分:0)

正如@MartijnPieters所说你应该使用dicts。

这是@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'))]

答案 5 :(得分:0)

您希望使用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