如何在两个单独的集合中返回匹配元素的总和

时间:2017-10-11 05:25:19

标签: python

我有两个带字符串的集合,我希望能够将set1元素与set2元素进行比较,并输出匹配元素的总和。如果我可以避免使用此循环,那么这也是首选。这个想法是这样的:

   set1 = ['some','words','are','here']
   set2 = ['some','words','are','over','here','too']

我正在寻找的函数在这里输出4 - 对于set2中包含的set1中的所有元素返回True。 R中的同样功能是

   sum(set1 %in% set2)

但是我找不到Python中的等价物。如果你们中的任何人能提供帮助,请告诉我。干杯

1 个答案:

答案 0 :(得分:2)

首先,你没有set个对象,你有list个对象:

>>> set1 = ['some','words','are','here']
>>> set2 = ['some','words','are','over','here','too']
>>> type(set1), type(set2)
(<class 'list'>, <class 'list'>)
>>>

Python支持set-literals,看起来像花括号:

>>> set1 = {'some','words','are','here'}
>>> set2 = {'some','words','are','over','here','too'}
>>> type(set1), type(set2)
(<class 'set'>, <class 'set'>)

Python set对象重载按位运算符以执行set-operations。您需要集合交集中的元素数量,因此请使用按位和运算符:

>>> set1 & set2
{'are', 'here', 'words', 'some'}
>>> len(set1 & set2)
4

或者,您可以使用更面向对象的样式:

>>> set1.intersection(set2)
{'are', 'here', 'words', 'some'}
>>> len(set1.intersection(set2))
4

我个人更喜欢运营商:

>>> set1 & set2 # intersection
{'are', 'here', 'words', 'some'}
>>> set1 | set2 # union
{'some', 'here', 'words', 'too', 'over', 'are'}
>>> set1 - set2 # difference
set()
>>> set2 - set1 # difference
{'too', 'over'}
>>> set2 ^ set1 # symmetric difference
{'over', 'too'}

如果您有list个对象,只需转换为set

>>> l1 = ['some','words','are','here']
>>> l2 = ['some','words','are','over','here','too']
>>> set(l1).intersection(l2)
{'some', 'are', 'words', 'here'}
>>> len(set(l1).intersection(l2))
4