0

我的程序会抓取一些网站并创建两个列表,一个用于类别,另一个用于内容。然后我使用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', ...}

{}

{}

{}

等等。

4

3 回答 3

2

使用带有is not None检查的 dict 理解:

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

从关于dict理解的文档中

于 2015-05-26T18:12:52.007 回答
1

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

假设这是保证你可以做到

# 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使用空列表进行压缩。

于 2015-05-26T18:16:27.207 回答
-1

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

category_list = filter(bool, category_list)
于 2015-05-26T18:12:28.887 回答