Python 如何删除具有已知值的字典键?
假设python dict:Python 如何删除具有已知值的字典键?,python,dictionary,Python,Dictionary,假设python dict: mydict = {'a': 100, 'b': 200, 'c': 300} 我知道其中一个价值观: value = 200 如何从dict中删除'b':200对?我需要这个: mydict = {'a': 100, 'c': 300} 使用一个。请注意(正如jonrsharpe所述),这将创建一个新字典,其中不包括要删除的key:value对。如果你想把它从你原来的字典中删除,那么请看他的答案 >>> d = {'a': 100, 'b'
mydict = {'a': 100, 'b': 200, 'c': 300}
我知道其中一个价值观:
value = 200
如何从dict中删除'b':200
对?我需要这个:
mydict = {'a': 100, 'c': 300}
使用一个。请注意(正如jonrsharpe所述),这将创建一个新字典,其中不包括要删除的key:value对。如果你想把它从你原来的字典中删除,那么请看他的答案
>>> d = {'a': 100, 'b': 200, 'c': 300}
>>> val = 200
# Use d.items() for Python 2.x and d.iteritems() for Python 3.x
>>> d2 = {k:v for k,v in d.items() if v != val}
>>> d2
{'a': 100, 'c': 300}
使用一个。请注意(正如jonrsharpe所述),这将创建一个新字典,其中不包括要删除的key:value对。如果你想把它从你原来的字典中删除,那么请看他的答案
>>> d = {'a': 100, 'b': 200, 'c': 300}
>>> val = 200
# Use d.items() for Python 2.x and d.iteritems() for Python 3.x
>>> d2 = {k:v for k,v in d.items() if v != val}
>>> d2
{'a': 100, 'c': 300}
听起来你想要:
for key, val in list(mydict.items()):
if val == value:
del mydict[key]
break # unless you want to remove multiple occurences
听起来你想要:
for key, val in list(mydict.items()):
if val == value:
del mydict[key]
break # unless you want to remove multiple occurences
您需要使用dict comprehension对每个items()进行循环:
new_dict = {k:v for k,v in my_dict.items() if predicate(value)}
或修改现有词典:
for k,v in my_dict.items():
if not predicate(v):
del my_dict[k]
您需要使用dict comprehension对每个items()进行循环:
new_dict = {k:v for k,v in my_dict.items() if predicate(value)}
或修改现有词典:
for k,v in my_dict.items():
if not predicate(v):
del my_dict[k]
我发现最简单的方法是:
for key in [k for k,v in mydict.items() if v==200]:
del mydict[key]
我发现最简单的方法是:
for key in [k for k,v in mydict.items() if v==200]:
del mydict[key]
你不应该创建一个名为
dict
的字典,它会覆盖内置的。你说得对,它只是一个伪解码。重命名它。可能的副本您不应该创建名为dict
的字典,它将覆盖内置的。您是对的,它只是一个伪解码。重命名它。请注意,这将生成一个新字典(不包括该值),而不是将其从原始字典中删除,这是正确的。一个后续问题:这似乎是对整个dict的迭代。我不能迭代到找到第一个值的点吗?如果您知道字典中只有一个key:value对,那么我建议jonrsharpe的答案(或类似的创建新字典)。然后,您可以在第一个实例上断开。在任何情况下,您都需要使用适当的for
循环,而不是dict理解。请注意,这将生成一个新的字典,排除该值,而不是将其从原始字典中删除。这是正确的。一个后续问题:这似乎是对整个dict的迭代。我不能迭代到找到第一个值的点吗?如果您知道字典中只有一个key:value对,那么我建议jonrsharpe的答案(或类似的创建新字典)。然后,您可以在第一个实例上断开。在任何情况下,你都需要对循环使用适当的,而不是听写理解。就是这样!我可以在del之后中断
。这就是我想要的,谢谢。@pythonishvili:不,它只是一个常规的python函数或表达式,您需要定义它就是这样!我可以在del之后中断。这就是我想要的,谢谢。@pythonishvili:不,这只是一个需要定义的常规python函数或表达式。修改我当前迭代的dict可以吗?这就是使用mydict.items()
的原因吗?在python3中,此解决方案失败(RuntimeError:dictionary在迭代过程中更改了大小
),因为mydict.items()返回的是一个迭代器,而不是像python2一样的列表。@pbacterio在3.3.2中对我来说运行良好-您使用的是哪个版本?抱歉,我在测试时没有使用break
语句来删除多个事件。在这种情况下,我建议将mydict.items()
与list
进行包装,以防止出现此异常。是否可以修改我当前迭代的dict?这就是使用mydict.items()
的原因吗?在python3中,此解决方案失败(RuntimeError:dictionary在迭代过程中更改了大小
),因为mydict.items()返回的是一个迭代器,而不是像python2一样的列表。@pbacterio在3.3.2中对我来说运行良好-您使用的是哪个版本?抱歉,我在测试时没有使用break
语句来删除多个事件。在本例中,我建议使用list
对mydict.items()
进行包装,以防止出现此异常。我没有否决你的意见,但你不必要地创建了一个列表理解,而你只是在重复。应改用gen expr。我将您的投票结果提升回零我不使用生成器,因为如果您尝试删除多个事件,可能会产生错误。我没有对您进行否决,但您不必要地创建了一个列表理解,您只是在重复。应改用gen expr。我将您的投票结果提高到零。我不使用生成器,因为如果您尝试删除多个事件,可能会产生错误。