2015-10-05 99 views
0

我有一個defaultdict,蟒蛇3.4,對象類似於:如何在字典中的某個值上過濾此python defaultdict?

mydefaultdict = defaultdict(dict) 
mydefaultdict['name1']['filename'] = 'name1' 
mydefaultdict['name1']['records_available'] = True 
mydefaultdict['name2']['filename'] = 'name2' 
mydefaultdict['name2']['records_available'] = False 

我想創建只是與records_available = True的過濾子集。到目前爲止,我有一個字典的理解,做:

defaultdict(dict, {k: v['records_available'] for k, v 
       in mydefaultdict.items() }) 

這是非常密切的。但我不知道如何實現一個過濾器。如果這是一個基本的字典,像下面這樣會起作用。

defaultdict(dict, {k: v['records_available'] for k, v 
       in mydefaultdict.items() if v == True }) 

我已經設法使用嵌套的for, if循環完成此操作。但是我對這個詞典的理解非常接近,我想知道是否有人可以找到解決方案。解析python集合對我來說是一項日常活動。

我目前的解決方案:

for i in audio_files.values(): 
    if i['records_available']: 
     filterd_files[i['filename']] = i 

編輯: user3100115是正確的。模擬問題數據不會使用user31000115的響應返回一條記錄。

+5

'{k:v for k,v in mydefaultdict.items()if v ['records_available'] == True}' – styvane

+1

@ user3100115:你爲什麼不把它作爲答案? –

+0

user3100115事實證明,我非常累,並且正在使用上面粘貼的代碼。正如你會注意到我的虛擬記錄都是'假'。我實際上嘗試了一個非常類似的解決方案,當然還有零記錄。感謝雙方確認我的理智,並讓我感到羞怯。 ;) – gonzo

回答

0

看起來很奇怪,你想得到v['records_available']作爲值(所有這個值是真實的)。但是你可能想要注意的是這些值沒有元素'records_available',或者根本不是字典。前者可以通過使用.get方法來解決,但是如果你想保護你不受後者的限制,你必須定義你自己的getitem(類似於getattr),當對象根本不支持訂閱時將返回default,或者不包含要求的項目:

def getitem(obj, key, default=None): 
    try: 
     return obj[key] 
    except (AttributeError, KeyError): 
     return default 

然後你只需使用它作爲一個過濾器(我用func(v)轉換到你想要的值,因爲我覺得要爲"records_available"項的值是沒有意義的 - 它不僅會是True):

{k, func(v) for k, v in mydefaultdict.items() if getitem(v, "records_available") == True)} 

請注意,只要v不包含"records_available"或根本不支持訂閱,則getitem將返回None - 因此該鍵值對將不會將其放入字典中。

相關問題