如何为 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_differencereduce 一起使用,但最终返回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 中唯一的项目测试多个集合?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 MongoDB 中的嵌入式文档创建唯一 ID?

如何为 MySQL 中的多个列指定唯一约束?

如何为多个动态 div 设置多个 Cookie

如何为行中的多个集合计算存储过程中两个日期之间的差异

如何为 IEnumerable 中的每个项目打开一个唯一的模式

如何为python项目创建虚拟环境