2012-07-20 56 views
1

給定一個由2元素元組鍵值的字典,我想返回其鍵值包含給定元素的所有鍵值對。返回並刪除其元組鍵值包含給定元素的所有鍵值對

例如,字典可以是:

tupled_dict = {('a',1):1, ('a',2):0, ('b',1):1, ('c',4):0} 

和給定的元素是'a',那麼應該返回的鍵值對是:

('a',1):1, ('a',2):0 

什麼是最快的代碼來做到這一點?

編輯:

另外,作爲相關的子問題,我感興趣的是刪除給出的鍵的元素的所有這樣的鍵值對的最快方式。顯然,一旦我得到上述結果,我可以使用一個循環刪除每個字典項目,但我不知道是否有捷徑去做。

+1

你有什麼[嘗試](http:// whath aveyoutried.com)? – jordanm 2012-07-20 00:37:37

回答

3

得到這些的:

>>> {k: v for k, v in tupled_dict.iteritems() if 'a' in k} 
{('a', 1): 1, ('a', 2): 0} 

同樣,刪除其他的:

>>> tupled_dict = {k: v for k, v in tupled_dict.iteritems() if 'a' not in k} 
>>> tupled_dict 
{('b', 1): 1, ('c', 4): 0} 
+0

如果字典可以包含元組以外的關鍵字(例如字符串),那麼您可能需要將'in'關鍵字交換爲不同的邏輯。 – wim 2012-07-20 00:57:05

+0

如果我沒有弄錯,刪除將創建一個新的字典,並將其分配給'tupled_dict'?什麼就地刪除?這會更快嗎? – MLister 2012-07-20 03:30:41

+0

這可能取決於哪些比例的條目將被刪除。你可以用'timeit'自己檢查一下 – wim 2012-07-20 05:07:13

2

我還沒有測試它的性能,但我建議你先使用for循環獲取一個基線,然後再用dict comprehensions

>>> {k:v for k, v in tupled_dict.iteritems() if k[0] == 'a'} 
{('a', 1): 1, ('a', 2): 0} 
+2

嚴格解釋這個問題,如果'a'是關鍵元組的第二個元素,這將不起作用。 – twneale 2012-07-20 00:58:11

1

此段代碼將工作,即使 '一' 不是第一要素一個關鍵元組:

from operator import methodcaller 

contains_a = methodcaller('__contains__', 'a') 
keys = filter(contains_a, tupled_dict) 
new_dict = dict(zip(keys, map(tupled_dict.get, keys)) 
相關問題