【问题标题】:Removing empty dictionary elements in Python在 Python 中删除空字典元素
【发布时间】:2021-11-21 05:47:25
【问题描述】:

我的程序会抓取一些网站并创建两个列表,一个用于类别,另一个用于内容。然后我使用dict(zip(......)) 命令匹配它们并将它们放入字典中。

类似这样的:

complete_dict=dict(zip(category_list,info_list))

我遇到的问题是我的程序正在读取两个列表(类别、信息)中的空元素。只要我以后可以删除它们就可以了。问题是,我没有找到这样做的方法。读出时,两个列表都包含空元素,而不是空字符串,而更像是列表中的空列表。我尝试在压缩它们后在列表和字典中删除它们,使用如下命令:

category_list=filter(None, category_list)

或:

info_list=[x for x in info_list if x != []]

当然对两个列表都进行了操作。

没有一个占上风。然后我尝试在字典中这样做:

dict((k, v) for k, v in complete_list.iteritems() if v)

此时我还能尝试什么?

编辑

我尝试了过滤,但我的条件设置不正确,或者根本无法解决问题。我正在寻找其他方式,因此它不是另一个线程的副本(尽管该线程有一些有用的信息)。

编辑 2

我现在得到的是:

[u'info1', u'info2', u'info3', u'info4', ...]

[]

[]

[]

[]

[u'info1', u'info2', u'info3', u'info4', ...]

[]

[]

[]

[u'info1', u'info2', u'info3', u'info4', ...]

信息 1、2、3 和 4(实际上还有更多元素)是从网站上抓取的内容,抱歉,我无法真正透露它们是什么,但这个想法显示了。这是列表之一(info_list),我正在尝试删除所有卡在中间的[],所以结果应该是这样的

[u'info1', u'info2', u'info3', u'info4', ...]

[u'info1', u'info2', u'info3', u'info4', ...]

[u'info1', u'info2', u'info3', u'info4', ...]

等等

编辑 3

dict(zip(...)) 之后我的结果是这样的

{u'category1': u'info1', u'category2': u'info2', ...}

{}

{}

{u'category1': u'info1', u'category2': u'info2', ...}

{u'category1': u'info1', u'category2': u'info2', ...}

{}

{}

{}

等等。

【问题讨论】:

  • Python: Filter a dictionary 的可能重复项
  • 请显示预期的输入和输出。你描述的方式对我来说仍然很模糊。
  • @Shashank 请检查编辑。提前谢谢你
  • 这看起来不像单个空键或值的问题。看起来你一遍又一遍地运行这种理解,有时,它会产生一个完全空的字典。可能是周围代码的问题。
  • 嗨@user2357112 你认为有办法通过简单地删除那些空的来解决它吗?

标签: python list dictionary empty-list


【解决方案1】:

使用带有is not None 检查的字典推导:

info_list = {k: v for (k, v) in complete_list.iteritems() if v is not None}

来自dict comprehensions上的文档

【讨论】:

  • 这个我试过了,结果还是一样。我使用了'complete_dict2 = {k: v for k, v in complete_dict.iteritems() if v is not None}' complete_dict 是将两个列表压缩在一起后的字典
【解决方案2】:

但更像是列表中的一个空列表。

假设这是保证你可以做到

# make sure value is not "[]" or "[[]]"
{k: v for k, v in complete_list.iteritems() if v and v[0]}

例子:

complete_list = {'x': [[]], 'y': [], 'z': [[1]]}
{k: v for k, v in complete_list.iteritems() if v and v[0]}
# returns {'z': [[1]]}

编辑

从您更新的问题中,我看到您在从这样的网站抓取后将列表压缩在一起:

complete_dict=dict(zip(category_list,info_list))

在某些情况下,您的info_list 似乎是空的,请这样做

if info_list:
    complete_dict=dict(zip(category_list,info_list))

确保您不会使用空列表压缩category_list

【讨论】:

  • 抱歉,它似乎不起作用。一件事是,当我将这两个列表压缩在一起时,我不知道什么被用作“关键”。两个列表都有空条目,因此将它们压缩在一起似乎没有任何问题。但是,由于没有“键”用于空值,我不知道如何调用或删除它们。
  • 嗯,根据您编辑的问题更新答案。
【解决方案3】:

使用过滤器,你错了,第一个参数必须是可调用的,接受一个参数,你可以使用内置的布尔函数

category_list = filter(bool, category_list)

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2021-04-09
    • 2011-08-16
    • 2019-08-22
    • 1970-01-01
    相关资源
    最近更新 更多