我有一个包含多组字符串的列表,我想找到每个字符串与该组中其他字符串之间的对称差异。
例如,我有以下列表:
targets = [{'B', 'C', 'A'}, {'E', 'C', 'D'}, {'F', 'E', 'D'}]
对于上述,所需的输出是:
[2, 0, 1]
因为在第一个集合中,A 和 B 在任何其他集合中都找不到,对于第二个集合,该集合没有唯一元素,而对于第三个集合,在任何其他集合中都找不到 F。
我想倒退着解决这个问题;找到每个集合的交集并从列表的长度中减去交集的长度,但是 set.intersection(*) 似乎不适用于字符串,所以我被卡住了:
set1 = {'A', 'B', 'C'}
set2 = {'C', 'D', 'E'}
set3 = {'D', 'E', 'F'}
targets = [set1, set2, set3]
>>> set.intersection(*targets)
set()
最佳答案
您遇到的问题是所有三组都没有共享字符串,因此您的 intersection
出现空。这不是字符串问题,它对数字或任何您可以放入集合中的东西都一样。
我看到对所有集合进行全局计算,然后使用它来查找每个集合中唯一值的数量的唯一方法是首先计算所有值(使用 collections.Counter
),然后对每个集合计算数量在全局计数中仅出现一次的值。
from collections import Counter
def unique_count(sets):
count = Counter()
for s in sets:
count.update(s)
return [sum(count[x] == 1 for x in s) for s in sets]
关于python-3.x - python : Symmetrical Difference Between List of Sets of Strings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53384697/