删除 Python 中的空字典元素
Removing empty dictionary elements in Python
我的程序会抓取一些网站并创建两个列表,一个用于类别,另一个用于内容。然后我使用 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 != []]
当然是两个列表都操作了。
None 占上风。然后我尝试在字典中使用:
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', ...}
{}
{}
{}
等等。
使用过滤器,你错了,第一个参数必须是可调用的接受一个参数,你可以使用内置的 bool 函数
category_list = filter(bool, category_list)
使用带有 is not None
检查的字典理解:
info_list = {k: v for (k, v) in complete_list.iteritems() if v is not None}
上的文档
but more like an empty list within a list.
假设这是保证你可以做到
# 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
。
我的程序会抓取一些网站并创建两个列表,一个用于类别,另一个用于内容。然后我使用 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 != []]
当然是两个列表都操作了。
None 占上风。然后我尝试在字典中使用:
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', ...}
{}
{}
{}
等等。
使用过滤器,你错了,第一个参数必须是可调用的接受一个参数,你可以使用内置的 bool 函数
category_list = filter(bool, category_list)
使用带有 is not None
检查的字典理解:
info_list = {k: v for (k, v) in complete_list.iteritems() if v is not None}
上的文档
but more like an empty list within a list.
假设这是保证你可以做到
# 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
。