我有几组值,需要检查给定值中的哪些值,并返回该组的名称。
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,但该方法会检查所有本地/全局集。这在这里不起作用,因为价值可以存在于其中的几个中。我需要能够指定要查看的集合。
答案 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')
''