我有一个类似的清单:
l = [[(3,4)], [(3,7)], [(3,8)]]
我使用该chain()
函数来平展列表,现在我有一个类似的列表:
l2 = [3,4,3,7,3,8]
我想将重复的项目分成另一个列表:
l3 = [3,3,3]
l4 = [4,7,8]
我使用了该set()
功能,但它破坏了重复的项目并导致:
l3 = [4,7,8]
但我想分别获得它们
您必须进行某种计数。使用collections.Counter()
该类会很容易:
from collections import Counter
counts = Counter(main_list)
duplicate_list, unique_list = [], []
for entry in main_list:
if counts[entry] > 1:
duplicate_list.append(entry)
else:
unique_list.append(entry)
counts
是多套或袋子;entry 到它的 count in 的映射main_list
。上面的例子保留了 的顺序main_list
。
扩展到@Martijn Pieters 答案,您可以使用 ifilter 过滤掉那些与 lambda 表达式中的条件匹配的内容(ifilter 中的第一个参数):
from collections import Counter
from itertools import ifilter
counts = Counter(l2)
l3 = list(ifilter(lambda x: counts[x] > 1, l2))
l4 = list(ifilter(lambda x: counts[x] == 1, l2))