簡體   English   中英

從嵌套字典中刪除鍵和值

[英]removing keys and values from a nested dictionary

我對編程比較陌生,我很困惑。

我有一本像下面這樣的字典。 我想說像n = "a"然后我想從字典中刪除每個變量n

然后我想刪除下面這個嵌套字典中的每個字母a 我知道如何在很小的程度上從字典中刪除內容,但我現在很困惑,因為我不知道如何使用嵌套字典來做到這一點。 在這種情況下,有一個鍵和一個值,但在值內部是另一個帶有其他鍵和值的字典。 我已經實現了 for 循環等嘗試做我想做的事情,但我得到的解決方案不是我想要的。

謝謝:)

{'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

dic = {'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

這是我到目前為止所擁有的,但它只是刪除了第一個 b 作為鍵,我如何訪問嵌套字典中的 b

n = "b"

del dic[n]

print(dic)

每當我做類似的事情時:

dic = {'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

每當我做類似的事情時:

n = "b"

for k in dic.keys():
    if k == n:
        del dic[k]

在終端中出現 RuntimeError: dictionary 在迭代過程中改變了大小

你可以寫一個遞歸函數:

def delete_key(k, dic):
  if k in dic:
      del dic[k]
  for val in dic.values():
    if isinstance(val, dict):
       delete_key(k, val)
  return dic

d = {'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

delete_key('b', d)

{'a': {'c': 9, 'f': 14},
 'c': {'a': 9, 'd': 11, 'f': 2},
 'd': {'c': 11, 'e': 6},
 'e': {'d': 6, 'f': 9},
 'f': {'a': 14, 'c': 2, 'e': 9}}

假設您想將字典轉換為矩陣,您可以按如下方式執行此操作:

from sklearn.feature_extraction import DictVectorizer

dictionary = {
    'b': {'a': 7, 'c': 10, 'd': 15},
    'a': {'b': 7, 'c': 9, 'f': 14},
    'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2},
    'f': {'a': 14, 'c': 2, 'e': 9},
    'd': {'b': 15, 'c': 11, 'e': 6},
    'e': {'d': 6, 'f': 9}
}


keys_removed = [dictionary.get(i) for i in dictionary]

dictvectorizer = DictVectorizer(sparse=False)
matrix = dictvectorizer.fit_transform(keys_removed)

這將提供以下輸出:

[[ 7.  0. 10. 15.  0.  0.]
 [ 0.  7.  9.  0.  0. 14.]
 [ 9. 10.  0. 11.  0.  2.]
 [14.  0.  2.  0.  9.  0.]
 [ 0. 15. 11.  0.  6.  0.]
 [ 0.  0.  0.  6.  0.  9.]]

矩陣索引對應於內部鍵值(a 到 f),這就是矩陣在特定鍵不存在值的情況下具有零的原因。

或者,如果您只想擺脫主鍵,您只需使用keys_removed = [dictionary.get(i) for i in dictionary]並將其從列表轉換。 這將為您提供以下信息:

[{'a': 7, 'c': 10, 'd': 15}, {'b': 7, 'c': 9, 'f': 14}, {'a': 9, 'b': 10, 'd': 11, 'f': 2}, {'a': 14, 'c': 2, 'e': 9}, {'b': 15, 'c': 11, 'e': 6}, {'d': 6, 'f': 9}]

編輯

如果要刪除某些鍵及其對應的條目,可以執行以下操作:

def delete_key(keys: list):

    dictionary = {
        'b': {'a': 7, 'c': 10, 'd': 15},
        'a': {'b': 7, 'c': 9, 'f': 14},
        'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2},
        'f': {'a': 14, 'c': 2, 'e': 9},
        'd': {'b': 15, 'c': 11, 'e': 6},
        'e': {'d': 6, 'f': 9}
    }

    
    for i in keys:
        dictionary.pop(i)
        
    return dictionary
    
print (delete_key(keys=['a', 'c']))

這需要您要刪除的鍵列表,並返回一個沒有它們的新字典。 以上案例輸出:

{'b': {'a': 7, 'c': 10, 'd': 15}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

根據您最近的澄清,這應該有效:

def delete_key(outer_keys: list, inner_keys: list):

    dictionary = {
        'b': {'a': 7, 'c': 10, 'd': 15},
        'a': {'b': 7, 'c': 9, 'f': 14},
        'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2},
        'f': {'a': 14, 'c': 2, 'e': 9},
        'd': {'b': 15, 'c': 11, 'e': 6},
        'e': {'d': 6, 'f': 9}
    }

    
    for i in outer_keys:
        dictionary.pop(i)
        
    for i in dictionary:
        for j in inner_keys:
            if j in dictionary[i]:
                dictionary[i].pop(j)
        
    return dictionary
    
print (delete_key(outer_keys=[], inner_keys=['a']))

該函數的工作原理如下:

  • 它允許您指定要刪除的鍵(和相應的條目)。 您只需在outer_keysinner_keys列出哪個,后者是嵌套字典中最深的鍵。
  • 這些必須定義為鍵名列表,如果您只想從內部或外部刪除鍵,則可以為空。

上面的例子將輸出以下內容:

{'b': {'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'b': 10, 'd': 11, 'f': 2}, 'f': {'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

您會注意到所有內部的“a”鍵都已被刪除。 該操作可以使用更少的循環來完成,但這應該足以很好地說明該過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM