如何通过特定元素获得2组元组的交互?

时间:2018-10-19 04:50:08

标签: python

有2套s1 {(1, 'string111'), (2, 'string222')}和s2 {(2, 'string333'), (3, 'string444')}。我可以通过ID(元组中的第一个元素)获得2个集合的交互。因此,我实际上想要获得的互动是{1, 2} & {2, 3},但返回{2, 'string222'}。还是使用其他数据结构代替Set of Tuples更好?

3 个答案:

答案 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()}