根据python中嵌套字典中的键删除项目
Posted
技术标签:
【中文标题】根据python中嵌套字典中的键删除项目【英文标题】:Deleting Items based on Keys in nested Dictionaries in python 【发布时间】:2018-06-09 13:55:41 【问题描述】:我有一个看起来像这样的字典:
'key1':
'a': 'key1',
'b': 'val1',
'c': 'val2'
,
'key2':
'a': 'key2',
'b': 'val3',
'c': 'val4'
,
'key3':
'a': 'key3',
'b': 'val5',
'c': 'val6'
我试图根据键“a”删除嵌套字典中的元素以获得如下输出:
'key1':
'b': 'val1',
'c': 'val2'
,
'key2':
'b': 'val3',
'c': 'val4'
,
'key3':
'b': 'val5',
'c': 'val6'
我为它写了如下sn-p:
for k in dict_to_be_deleted:
del k["a"]
我不断收到 Key Error: k not found。我也尝试了以下方法:
for i in dict_to_be_deleted:
for k,v in i.items():
if "a" in k:
del i[k]
我明白了
Attribute Error: str object has no attribute items
但它不应该是一个字典,因为dict_to_be_deleted
是一个嵌套字典吗?我对此很困惑。我非常感谢这方面的任何指示。
【问题讨论】:
【参考方案1】:一个简单的方法是改用dict.pop()
:
data =
'key1':
'a': 'key1',
'b': 'val1',
'c': 'val2'
,
'key2':
'a': 'key2',
'b': 'val3',
'c': 'val4'
,
'key3':
'a': 'key3',
'b': 'val5',
'c': 'val6'
for key in data:
data[key].pop('a', None)
print(data)
哪些输出:
'key1': 'b': 'val1', 'c': 'val2', 'key2': 'b': 'val3', 'c': 'val4', 'key3': 'b': 'val5', 'c': 'val6'
dict.pop()
的工作方式是首先检查键是否在字典中,在本例中为 "a"
,然后将其删除并返回其值。否则,返回一个默认值,在本例中为None
,它可以防止KeyError
。
【讨论】:
【参考方案2】:当您遍历字典时,dict_to_be_deleted
您只是在遍历键。因此,在您的第二次尝试中,您的 Attribute Error
是因为 i
是键,而不是字典的字符串。您如何实际执行它是使用 .values()
来迭代值。
for v in dict_to_be_deleted.values():
del v["a"]
但是,就个人而言,我建议不要删除元素,而是遵循 Ajax 的方法并构建一个没有丢失元素的新字典。像我们在这里所做的那样奇怪的突变是获取错误的简单方法。
【讨论】:
这怎么“怪”? 非常感谢您的快速帮助。我也采纳了您的建议来创建一个新的 dict 以确保代码效率。 @StefanPochmann “怪异”可能是错误的词,但为了避免可能的副作用,请始终尝试并犯错。如果这被包装为函数的某个部分,那么您传入的参数突然会发生变化,而您可能没有意识到这一点。然而,复制字典总是安全的(只要你复制得足够深)。 @Ravi 您从头开始创建整个东西...为了效率? @StefanPochmann 我想在那种情况下,我的直觉更多是关于创建一个复制Counter
的字典,而不是实际的 dict 突变。清晰胜出。 (实际上只使用Counter
回答该问题确实是最好的)。我的感觉,除非你有理由不这样做,否则请注意安全。【参考方案3】:
在这种情况下,最好过滤字典的内容:
d =
'key1':
'a': 'key1',
'b': 'val1',
'c': 'val2'
,
'key2':
'a': 'key2',
'b': 'val3',
'c': 'val4'
,
'key3':
'a': 'key3',
'b': 'val5',
'c': 'val6'
new_d = a:c:d for c, d in b.items() if c != 'a' for a, b in d.items()
输出:
'key3': 'c': 'val6', 'b': 'val5', 'key2': 'c': 'val4', 'b': 'val3', 'key1': 'c': 'val2', 'b': 'val1'
【讨论】:
【参考方案4】:你可以简单地使用两个字典的函数和列表理解 pop() & itervalues()
[value.pop('a', None) for value in d.itervalues()]
打印 d
输出 > 'key3': 'c': 'val6', 'b': 'val5', 'key2': 'c': 'val4', 'b ': 'val3', 'key1': 'c': 'val2', 'b': 'val1'
优点:不占用额外内存。因为我们没有在这里创建新的字典
如果您正在寻找简单的@Ajax1234 答案更具描述性
【讨论】:
【参考方案5】:当您可以提取所需内容时,为什么要删除?这是 collections.defaultdict(dict) 方法:
data=
'key1':
'a': 'key1',
'b': 'val1',
'c': 'val2'
,
'key2':
'a': 'key2',
'b': 'val3',
'c': 'val4'
,
'key3':
'a': 'key3',
'b': 'val5',
'c': 'val6'
import collections
dict_1=collections.defaultdict(dict)
for key,value in data.items():
for key_1,value_1 in value.items():
if key!='a':
dict_1[key][key_1]=value_1
print(dict_1)
输出:
"key1":
"b": "val1",
"c": "val2"
,
"key2":
"b": "val3",
"c": "val4"
,
"key3":
"b": "val5",
"c": "val6"
【讨论】:
以上是关于根据python中嵌套字典中的键删除项目的主要内容,如果未能解决你的问题,请参考以下文章