如何为 Python 中唯一的项目测试多个集合?
Posted
技术标签:
【中文标题】如何为 Python 中唯一的项目测试多个集合?【英文标题】:How can I test several sets for items that are unique in Python? 【发布时间】:2018-10-07 05:46:02 【问题描述】:我正在寻找一种方法来找到几组之间的独特物品。以这3套为例。
x = 1, 2
y = 1, 3
z = 1, 3, 4, 5
我怎样才能找到独特的物品?我正在寻找这样的东西。
findunique(x, y, z) # 2, 4, 5
我尝试将symmetric_difference
与reduce
一起使用,但最终返回1, 2, 4, 5
。
我能想到的唯一另一件事是让dict
跟踪每个项目的计数,并仅返回计数为 1 的那些。然而,这似乎非常低效和不合情理。解决这个问题的“正确”方法是什么?
【问题讨论】:
【参考方案1】:使用chain
将这些集合组合成一个列表。用Counter
计算每个项目的出现次数。选择只出现一次的项目并制作一组。
from collections import Counter
from itertools import chain
sets = x,y,z
x for x, cnt in Counter(chain.from_iterable(sets)).items() if cnt==1
#2, 4, 5
已编辑,基于 @jedwards 的 cmets。
【讨论】:
为什么不简单地x for x, cnt in Counter(chain(x, y, z)).items() if cnt==1
?
@jedwards 没什么大的区别,不过用from_iterable
就是considered more elegant。
使用map(list, ...)
不必要地创建列表是否被认为更优雅?
@jedwards 那部分确实是多余的。
@DYZ 星号符号呢? Counter(chain(*sets))
【参考方案2】:
您可以在将 sets
转换为单个列表后将其展平,然后将其过滤为计数等于 1 的项目。
lista = [x, y, z]
listb = [j for i in lista for j in i]
print(set(filter(lambda x: listb.count(x) == 1, listb)))
# 2, 4, 5
【讨论】:
以上是关于如何为 Python 中唯一的项目测试多个集合?的主要内容,如果未能解决你的问题,请参考以下文章