当前位置: 首页 > 知识库问答 >
问题:

从字典中的迭代中删除“无”

梁存
2023-03-14

我有一个字典列表,里面有各种键和值。我正试着根据钥匙分组

from itertools import chain, zip_longest 

data = [
    {'a': 2, 'b': 4, 'c': 3, 'd': 2},   
    {'b': 2, 'c': 2, 'd': 5, 'e': 4, 'f': 1},
    {'a': 2, 'd': 2, 'e': 6, 'f': 5, 'g': 12},
    {'b': 2, 'd': 2, 'e': 6, 'f': 6},
    {'c': 5, 'e': 33, 'g': 21, 'h': 56, 'i': 21}
    ]

print(type(data))

bar ={
    k: [d.get(k) for d in data]
    for k in chain.from_iterable(data)
}

print(bar)

我的输出:

{'a': [2, None, 2, None, None], 'b': [4, 2, None, 2, None], 
'c': [3, 2, None, None, 5], 'd':[2, 5, 2, 2, None], 'e': [None, 4, 6, 6, 33], 
'f': [None, 1, 5, 6, None], 'g': [None, None, 12, None, 21], 
'h': [None, None, None, None, 56], 'i': [None, None, None, None, 21]}

我不想在值中显示“无”

期望输出:

 {'a': [2, 2], 'b': [4, 2, 2], 'c': [3, 2, 5], 'd':[2, 5, 2, 2], 'e': [4, 6, 6, 33], 
'f': [1, 5, 6], 'g': [1221], 'h': [56], 'i': [21]}

我也尝试过使用过滤函数,但没有成功。有关于如何删除无的指导吗?

代码

共有3个答案

何建中
2023-03-14

如果您想使用代码,只需执行以下操作:

bar ={
    k: [d.get(k) for d in data if d.get(k) != None]
    for k in chain.from_iterable(data)
}

print(bar)

输出:

{'a': [2, 2], 'b': [4, 2, 2], 'c': [3, 2, 5], 'd': [2, 5, 2, 2], 'e': [4, 6, 6, 33], 'f': [1, 5, 6], 'g': [12, 21], 'h': [56], 'i': [21]}
司徒良哲
2023-03-14

如果密钥不存在,则使用get(返回None),而不是使用d[k],而是先检查d中是否有k。另外,我建议不要使用chain,因为这样会计算许多列表两次或更多次,每次都会覆盖先前创建的列表,因为许多键存在于多个字典中。相反,您可以迭代所有键的

>>> {k: [d[k] for d in data if k in d]
...  for k in set(k for d in data for k in d)}
...
{'a': [2, 2], 'b': [4, 2, 2],
 'c': [3, 2, 5], 'd': [2, 5, 2, 2],
 'e': [4, 6, 6, 33], 'f': [1, 5, 6],
 'g': [12, 21], 'h': [56], 'i': [21]}
羊舌自强
2023-03-14

试试这个:

from operator import is_not
from functools import partial

{ k: list(filter(partial(is_not, None), v)) for k, v in d.items() }

输入:{'x':[0, 23, 234, 89,无,0,35,9]}

输出:{'x':[0,23,234,89,0,35,9]}

 类似资料:
  • 本文向大家介绍在Python中迭代时从字典中删除项目,包括了在Python中迭代时从字典中删除项目的使用技巧和注意事项,需要的朋友参考一下 python字典是无序,可变和索引的集合。它们具有键和值,并且使用键来引用每个项目。在本文中,我们将探讨从字典中删除项目的方法。 与键一起使用del 在这种方法中,我们捕获了需要删除的键值。一旦应用了del函数,这些键的键值对就会被删除。 示例 输出结果 运行

  • 问题内容: 在Python上进行迭代时从字典中删除项目是否合法? 例如: 这个想法是从字典中删除不满足特定条件的元素,而不是创建一个新字典,该字典是正在迭代的字典的子集。 这是一个好的解决方案吗?有没有更优雅/更有效的方法? 问题答案: 此答案不适用于,并且会给出。 :字典在迭代过程中更改了大小。 发生这种情况是因为返回的是迭代器而不是列表。正如评论中指出的那样,只需将其转换为列表即可,它应该可以

  • 问题内容: 在Python上进行迭代时从字典中删除项目是否合法? 例如: 这个想法是从字典中删除不满足特定条件的元素,而不是创建一个新字典,该字典是正在迭代的字典的子集。 这是一个好的解决方案吗?有没有更优雅/更有效的方法? 问题答案: 此答案不适用于,并且会给出。 :字典在迭代过程中更改了大小。 发生这种情况是因为返回的是迭代器而不是列表。正如评论中指出的那样,只需将其转换为列表即可,它应该可以

  • 问题内容: 如果我有词典列表,请说: 并且我想删除具有2(或name )的字典,以编程方式解决此问题的最有效方法是什么(也就是说,我不知道列表中条目的索引,因此它可以)只是被弹出)。 问题答案: 编辑 :由于对此代码的性能提出了一些疑问(一些基于对Python的性能特征的误解,一些基于超出给定规范的假设,即列表中仅存在一个dict,其key的值为2) id”),我希望在此方面给您保证。 在旧的Li

  • 问题内容: 我在做: 这引发了ConcurrentModificationException,所以我将其更改为: 此操作以及任何其他修改映射的过程都在同步块中。 有更好的解决方案吗? 如果没有人提出更好的解决方案,那么首先要说“没有” 问题答案: 从Java 8开始,你可以执行以下操作:

  • 问题内容: 从字典中删除键时,我使用: 有没有一种方法可以做到这一点? 问题答案: 要删除键而不管它是否在字典中,请使用以下两个参数的形式: 如果典中存在,则返回,None否则返回。如果第二个参数未指定(即)并且key不存在,则引发a。 要删除肯定存在的密钥,你还可以使用 如果关键字在字典中不存在,则会引发 。