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

2024-04-16 05:16:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个值集,需要检查给定值位于其中的哪一个,并返回该集的名称。你知道吗

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

我想检查值是否存在于集合1-3中,而不在方法中包含集合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)

但是这种方法检查所有的局部/全局集合。这在这里不起作用,因为这个值可以存在于其中的几个。我需要能够指定在哪些集合中查找。你知道吗


Tags: 方法lambda函数in名称forifvalue
1条回答
网友
1楼 · 发布于 2024-04-16 05:16:20

不要使用一个丑陋的黑客lambda,它在globals中挖掘,这样你就可以得到一个名字;这会让任何阅读你的代码的人(包括你自己)困惑:-)。你知道吗

你想得到你定义的集合的名称,这就是为什么我们有字典。用你的集合制作一本字典,然后你可以创建方便的/可读的集合/列表理解,以紧凑可读的方式获得你想要的:

>>> 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'}

要排除某个名称,请将另一个required子句添加到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')
''

相关问题 更多 >