Python:字符串集列表之间的对称差异

时间:2018-11-20 00:49:28

标签: python-3.x set set-intersection symmetric-difference

我有一个包含多组字符串的列表,我想找到每个字符串与该组中其他字符串之间的对称差异。

例如,我有以下列表:

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()

3 个答案:

答案 0 :(得分:1)

尝试如下操作:

获取每个集合的对称差异。然后与给定的输入集相交。

def symVal(index,targets):
    bseSet = targets[index] 
    symSet = bseSet  
    for j in range(len(targets)):
        if index != j:
            symSet =  symSet  ^ targets[j] 
    print(len(symSet & bseSet))

for i in range(len(targets)):
    symVal(i,targets)

答案 1 :(得分:1)

您的代码示例不起作用,因为它找到了所有集合之间的交集,该交集为0(因为到处都没有元素出现)。您想找到每个集合与所有其他集合的并集之间的差异。例如:

set1 = {'A', 'B', 'C'}
set2 = {'C', 'D', 'E'}
set3 = {'D', 'E', 'F'}


targets = [set1, set2, set3]

result = []

for set_element in targets:
    result.append(len(set_element.difference(set.union(*[x for x in targets if x is not set_element]))))

print(result)

(请注意[x for x in targets if x != set_element]只是所有其他集合的集合)

答案 2 :(得分:1)

您遇到的问题是,所有三个集合都没有共享字符串,因此您的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]