2016-09-07 61 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'並獲取提供的迭代器的第一個值,如我更新的答案中所示。 –