簡體   English   中英

Python:字符串列表之間的對稱差異

[英]Python: Symmetrical Difference Between List of Sets of Strings

我有一個包含多組字符串的列表,我想找到每個字符串與集合中其他字符串之間的對稱差異。

例如,我有以下列表:

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

嘗試以下內容:

獲得每一組的對稱差異。 然后與給定的輸入集相交。

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)

你的代碼示例不起作用,因為它找到了所有集合之間的交集,它是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][x for x in targets if x != set_element]只是所有其他集合的集合)

你遇到的問題是所有三組都沒有共享的字符串,所以你的intersection是空的。 這不是一個字符串問題,它可以與數字或其他任何你可以放在一個集合中的相同。

我看到對所有集合進行全局計算的唯一方法,然后使用它來查找每個collections.Counter中唯一值的數量是首先計算所有值(使用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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM