基于条件删除列表中的元素

15
我有一个元素列表,我想要移除那些在整个列表中总数小于或等于2的元素。
例如:
A = [['a','b','c'],['b','d'],['c','d','e'],['c','e','f'],['b','c','e','g']]

我想要从A中移除'a''d''f''g',并将其余部分存储到B中,使列表变为:

B = [['b','c'],['b'],['c','e'],['c','e'],['b','c','e']]

我创建了一个字典,它将存储所有元素的计数,并基于此我希望删除计数小于或等于2的元素。

以下是我目前编写的代码。

for i in range(len(A)):
    for words in A[i]:
        word_count[words] +=1
    B = [A[i] for i in range(len(A)) if word_count[words]<2]
2个回答

13
你可以使用collections.Counter
from collections import Counter
import itertools
A = [['a','b','c'],['b','d'],['c','d','e'],['c','e','f'],['b','c','e','g']]
c = Counter(itertools.chain(*A))
new_a = [[b for b in i if c[b] > 2] for i in A]

输出:

[['b', 'c'], ['b'], ['c', 'e'], ['c', 'e'], ['b', 'c', 'e']]

@BcK 感谢您的帮助。对我来说它正在工作。此外,在同一列表中,如果我想将百分比存储在c中,然后选择大于40%的百分比,我该怎么做呢?即如何在c中存储百分比。 - Ankita Patnaik
1
total = sum(c.values()); for k, v in c.items(): c[k] = v / total 这样的代码应该可以工作 @AnkitaPatnaik - BcK
3
这次回答出奇的好,我已经点赞了。作为改进,考虑使用chain.from_iterable(A)而非chain(*A),因为前者更高效。 - cs95

4

在向字典添加新的键(key)之前,您需要检查该是否已经存在。如果不存在,则只需将添加到字典中。否则,请更新的值。

A = [['a','b','c'],['b','d'],['c','d','e'],['c','e','f'],['b','c','e','g']]
word_count = {}
for i in range(len(A)):
  for words in A[i]:
    if words not in word_count:
      word_count[words] = 0
    word_count[words] += 1

然后使用创建的字典来过滤初始列表。

B = [[x for x in A[i] if word_count[x] > 2] for i in range(len(A))]
print(B)

输出

[['b', 'c'], ['b'], ['c', 'e'], ['c', 'e'], ['b', 'c', 'e']]

1
if words not in word_count: word_count[words] = 0 这段代码可以简写为 word_count.setdefault(words, 0) - BcK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接