如果项目的长度小于或等于1,则从字典中删除项目

Man*_*ngo 5 python dictionary

有没有一种方法可以使用字典的索引位置(如果有的话)从字典中删除键,而不是使用实际的键(避免del d['key']使用例如,而是使用索引位置)从字典中删除键?

如果有的话,也不必理会这个问题的其余部分,因为这也是我在寻找的内容。


因此,作为我的例子,我有字典d,它使用列表作为值:

d = {'acd': ['cad'], 'abd': ['bad', 'dab']}
Run Code Online (Sandbox Code Playgroud)

我想从这样的字典中完全删除每个键,这些字典的值的项目长度小于2(因此,如果只有1个项目)。

因此,在此示例中,我想删除键,'acd'因为它的值列表只有1个项目['cad']'abd'有2个项目['bad', 'dab'],所以我不想删除它-仅当它包含1个或更少的项目时。这本字典只是一个例子-我正在使用比这更大的版本,并且我需要它来删除所有单个项目值键。

我为测试编写了该代码,但是我不确定如何删除想要的密钥-或确定它们是什么。

d = {'acd': ['cad'], 'abd': ['bad', 'dab']}

index_pos = 0

for i in d.values():

    #Testing and seeing stuff
    print("pos:", index_pos)
    print(i)
    print(len(i))

    if len(i) < 2:

        del d[???]
        #What do I do?

    index_pos += 1
Run Code Online (Sandbox Code Playgroud)

我使用index_pos是因为我认为它可能有用,但不确定。

我知道我可以使用以下方法从字典中删除一个条目

del d['key']
Run Code Online (Sandbox Code Playgroud)

但是,如何避免使用键,例如改用索引位置,或者如何找出键,以便将其删除?

jpp*_*jpp 7

只需使用字典理解即可:

d = {'acd': ['cad'], 'abd': ['bad', 'dab']}
res = {k: v for k, v in d.items() if len(v) >= 2}
Run Code Online (Sandbox Code Playgroud)

是的,您正在创建一个新的字典,但这本身通常不是问题。任何解决方案都需要O(n)时间。

可以在修改原始字典的同时迭代字典的副本。但是,您应该发现字典理解效率更高。在任何情况下,迭代原始字典时都不要删除或添加键。

  • @Mandingo,[docs](https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects) 说:`在字典中添加或删除条目时迭代视图可能会引发 RuntimeError 或无法遍历所有条目。` 更多详细信息:[在迭代时修改 Python dict](/sf/ask/474423981/ )。 (2认同)