查找值属于多个集合中的哪一个

时间:2016-09-07 08:52:58

标签: python python-3.x set

我有几组值,需要检查给定值中的哪些值,并返回该组的名称。

value = 'a'
set_1 = {'a', 'b', 'c'}
set_2 = {'d', 'e', 'f'}
set_3 = {'g', 'h', 'i'}
set_4 = {'a', 'e', 'i'}

我想检查第1-3组中是否存在值,而不在方法中包含set_4,并返回集名称。如下所示:

find_set(value in set_1, set_2, set_3)

应该返回

set_1

也许有些整齐的lambda功能?我试过了

w = next(n for n,v in filter(lambda t: isinstance(t[1],set), globals().items()) if value in v)

来自Find if value exists in multiple lists,但该方法会检查所有本地/全局集。这在这里不起作用,因为价值可以存在于其中的几个中。我需要能够指定要查看的集合。

1 个答案:

答案 0 :(得分:2)

不要使用一个挖掘globals的丑陋hackish lambda,这样你就可以获得一个名字;几个星期之后,这会让任何阅读你的代码的人感到困惑: - )。

您希望能够获得已定义的集合的名称,这就是我们拥有字典的原因。从您的集合中创建一个字典,然后您可以创建方便/可读的集合/列表理解,以便以紧凑的可读方式获得您想要的内容:

>>> d = {'set_1': set_1, 'set_2': set_2, 'set_3': set_3, 'set_4': set_4}

要捕获'a'所在的所有集合:

>>> {name for name, items in d.items() if 'a' in items}
{'set_1', 'set_4'}

要排除某个名称,请将另一个必需条款添加到if进行过滤:

>>> {name for name, items in d.items() if 'a' in items and name != 'set_4'}
{'set_1'}

你当然可以将其纳入一个功能中,并且如果你将来碰到它就会很高兴你能理解它:

def find_sets(val, *excludes, d=d):
    return {n for n, i in d.items() if val in i and n not in excludes}

这与前一个行为类似。 d=d可能不是你想要的方式,你可能会更好地使用一些**d语法。

如果您只想获取第一个值,请从您的函数返回next(comprehension),如下所示:

def find_sets(val, *excludes, d=d):
    return next((n for n, i in d.items() if val in i and n not in excludes), '')

如果没有实际找到任何元素,''只表示要返回的默认值,也就是说,当使用不存在的值调用时,将返回空字符串(可能会根据更改而变化)你的偏好):

>>> find_sets('1')
''