由於數據結構如下:Python的字典重組
out = {
'foo': { 'public':{}, 'private':{}, 'other':{} },
'bar': { 'public':{}, 'private':{}, 'other':{} }
}
我試圖片出底部結構的部分來創建一個新dict
。我對此的用途是迴應所有數據的請求,但標記爲private
的除外。
爲了做相反的是微不足道:
response = {x,y['private'] for x,y in out.iteritems()}
它構造一個字典用於每個foo
和bar
僅包含數據標記private
。但有標準庫的一些功能(itertools也許),將產生以下:
out = {
'foo': { 'public':{}, 'other':{} },
'bar': { 'public':{}, 'other':{} }
}
我曾嘗試以下:
{x:(y['public'], y['other']) for x,y in out.iteritems()}
雖然我寧願不使用一個元組,和不明確地命名每個子結構,因爲這不是可重用的或可擴展的。
def remove(name, obj):
return {x:y for x,y in obj.iteritems() if x is not name}
{x:remove('private',y) for x,y in out.iteritems()}
這似乎工作,但有沒有更好的方法?有任何想法嗎?
這實質上是我嘗試過的最後一件事,但是我喜歡這裏我可以指定多個鍵的事實。這是很好,乾淨。謝謝。 – Aesthete 2012-08-16 12:00:51
我喜歡你的回答比我的回答更普遍,但我仍然會寫'remove_items'來複制原始文件,然後'刪除'不需要的文件。這樣你只需遍歷[大概更短的]不需要的列表,而不是完整的字典鍵列表。 – Duncan 2012-08-16 12:00:55
@Duncan我原本打算建議在副本上使用del,而不是用一行代碼。在簡單的數據類型例如字典中,我懷疑這會更快。在要刪除的值是複雜類型的情況下,複製它們以便再次丟棄它們可能會更加昂貴。 – 2012-08-16 12:09:52