我有两套,每套都包含许多元组:
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)并输出它。
您是否必须使用确切的元组来检查它是否在使用中的集合中,以及如何访问此元组以将其打印出来?
答案 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