有2套s1 {(1, 'string111'), (2, 'string222')}
和s2 {(2, 'string333'), (3, 'string444')}
。我可以通过ID(元组中的第一个元素)获得2个集合的交互。因此,我实际上想要获得的互动是{1, 2} & {2, 3}
,但返回{2, 'string222'}
。还是使用其他数据结构代替Set of Tuples更好?
答案 0 :(得分:1)
针对set
查找s2
中的每个tuple
,在s1
中的所有ID上设置id2
s1 = {(1, 'string111'), (2, 'string222')}
s2 = {(2, 'string333'), (3, 'string444')}
id2 = {x[0] for x in s2} # all the id in s2
filtered = list(filter(lambda x: x[0] in id2, s1)) # lookup id2 and filter
print(filtered) # => [(2, 'string222')]
非FP版本
id2 = {x[0] for x in s2}
ret = set()
for x in s1:
if x[0] in id2:
ret.add(x)
print(ret) # => {(2, 'string222')}
答案 1 :(得分:1)
或者为什么不呢?
print({i for i in s1 if {i[0]}==set.intersection(set(map(lambda x:x[0],s1)),set(map(lambda x:x[0],s2)))})
输出:
{(2, 'string222')}
或者为什么不呢?
print({i for i in s1 if i[0] in map(lambda x:x[0],s2)})
输出:
{(2, 'string222')}
或itemgetter
:
from operator import itemgetter
print({i for i in s1 if i[0] in map(itemgetter(0),s2)})
输出:
{(2, 'string222')}
答案 2 :(得分:0)
我认为将集合转换为字典更方便:
d1 = dict(s1) # {1: 'string111', 2: 'string222'}
d2 = dict(s2) # {2: 'string333', 3: 'string444'}
for i in d1:
if i in d2:
print(i, d1[i])
# 2 string222
或更简洁(使用集合理解):
{(i, d1[i]) for i in d1 if i in d2} # {(2, 'string222')}
# equivalently {(i, d1[i]) for i in d1.keys() & d2.keys()}