2016-09-07 34 views
0

我有几组值,需要检查其中某些值是位于哪个值中,并返回该值的名称。查找多个值中的哪一个值属于

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

@PadraicCunningham我想将值的名称更改为集名称的名称。这是识别同一事物的不同形式写作的功能。例如。我想检查trastutsumab中的TRASTUTSUMAB = {Trastutsumab,trastutsumab,TRASTUTSUMAB,....}并将其值更改为trastutsumab。(我正在研究过去20年来所开的药物的医院统计数据,这些年来许多药物的写作形式已经改变) –

回答

2

不要使用一个丑陋的黑客拉姆达在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'} 

要排除一些名称添加另一种的要求条款的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') 
'' 
+0

非常好,谢谢!这应该工作,是的,它比我尝试的混乱少得多。 –

+0

哦,最后一件事。这将返回一组(集合名称)。在我的情况下,总是只有一个正确的集合名称,所以不要返回{'name'},我希望函数只返回'name'。我想我可以'弹出'集合中的单个值,但是对上述代码做了一个简单的修改来完成相同的操作吗? –

+0

@Anttillonen你可以使用列表理解并返回'[n为n,我在d.items()中如果val中的i和n不包含] [0]'即第一项,或者使用'next'并获取提供的迭代器的第一个值,如我更新的答案中所示。 –