比较两个列表和过滤元素,这些元素在一个中占多数,在另一个中占少数

时间:2018-05-04 09:22:51

标签: python

我有一个类似树的结构,其中每个节点都附加了5个文档的列表。每个文档都有一定数量的单词。我想保留每个节点上的所有单词,这些单词在该节点中占多数,在其他节点中占少数,或者在该节点中占60%以上的文档,在其兄弟中的文档少于40%。

例如:A是父节点,B,C是其子节点,每个子节点都附有5个文档的列表。

B = [['a','b','c','d','m'],['b','d','m','n'],['c','d','e','o'],['c','e','f','n'],['b','c','e','g']]
C = [['a','m','n'],['a','m','o'],['b','c','m','n'],['c','n','o'],['b','n','o','g']]

所以我想把b,c,d保留在B中,因为它们在B中占多数,在C中占少数,在C中同样是m,n,o。 最后B和C将如下所示:

B = [['b','c','d'],['b','d'],['c','d'],['c'],['b','c']]
C = [['m','n'],['m','o'],['m','n'],['n','o'],['n','o']]

请帮助我如何做到这一点。

1 个答案:

答案 0 :(得分:1)

以下是我使用易于理解的代码的建议:

B = [['a','b','c','d','m'],['b','d','m','n'],['c','d','e','o'],['c','e','f','n'],['b','c','e','g']]
C = [['a','m','n'],['a','m','o'],['b','c','m','n'],['c','n','o'],['b','n','o','g']]

# 1. Retrieve the set of all words
wordSet = set([word for words in B+C for word in words])

# 2. Compute the occurrences of each word in each node
occurB = {word:0 for word in wordSet}
occurC = {word:0 for word in wordSet}
for word in wordSet:
    for document in B:
        if word in document:
            occurB[word] += 1
    for document in C:
        if word in document:
            occurC[word] += 1  

# 3. Filter the nodes using majority and minority
majorityB, minorityB = int(0.6 * len(B)), int(0.4 * len(B))
majorityC, minorityC = int(0.6 * len(C)), int(0.4 * len(C))
newB = [[word for word in document if occurB[word] >= majorityB and occurC[word] <= minorityC] for document in B]
newC = [[word for word in document if occurC[word] >= majorityC and occurB[word] <= minorityB] for document in C]

print(newB) # [['b', 'c', 'd'], ['b', 'd'], ['c', 'd', 'e'], ['c', 'e'], ['b', 'c', 'e']]
print(newC) # [['m', 'n'], ['m', 'o'], ['m', 'n'], ['n', 'o'], ['n', 'o']]

注意:
与原始问题相比,'e'另外保存在newB中。但我认为这是合乎逻辑的,因为它在B中占多数,在C中占少数。