2015-05-26 1 views
0

Моя программа очистит некоторые веб-сайты и создаст два списка: один для категории, другой для контента. Затем я использую команду dict (zip (......)), чтобы сопоставить их и поместить их в dict.Удаление пустых элементов словаря в Python

что-то вроде этого:

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) 

Я как бы не понимаю, что еще я могу сделать на данный момент. Может кто-нибудь помочь?

спасибо.

EDIT: Я пробовал фильтровать, и либо мои условия установлены неправильно, либо просто не решают проблему. Я ищу другой способ, чтобы он не дублировал другой поток. (Что нить имеет некоторую полезную информацию, хотя)

edit2: Что я получаю прямо сейчас

[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), и я пытаюсь удалить все [] s застрял в середине, так что результат должен быть как

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

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

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

и так далее

EDIT3:

Мой результат выглядит следующим образом после Dict (застежка-молния (...))

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

{} 

{} 

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

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

{} 

{} 

{} 

и так далее

+0

Возможный дубликат [Python: Фильтр словаря] (http://stackoverflow.com/questions/2844516/python-filter-a-dictionary) –

+2

Пожалуйста, покажите ожидаемый ввод и вывод. Это все еще неопределенно для меня, как вы описали его. – Shashank

+0

@Shashank, пожалуйста, проверьте EDIT. Заранее спасибо – JChao

ответ

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]]} 

EDIT

С обновленным вопросом, я вижу, вы проносясь списками вместе после выскабливания с веб-сайта, например:

complete_dict=dict(zip(category_list,info_list)) 

Похоже, ваш info_list пуст, в некоторых случаях, просто сделать

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

, чтобы убедиться, что вы не пронестись category_list с пустым списком.

+0

жаль, что это не похоже, что это работает , Одно дело, я не знаю, что используется как «ключ», когда я скреплял эти два списка вместе. Оба списка имеют пустые записи, поэтому, похоже, нет проблем с их копированием. Однако, поскольку для пустых значений не используется «ключ», я не знаю, как их вызывать или удалять. – JChao

+0

hmmm ok обновленный ответ на основе вашего отредактированного вопроса. –

+0

Большое вам спасибо @Martin Konecny. Проблема решена! – JChao

-1

использования фильтра, вы га d это неправильно, первый аргумент должен быть отозваны принимать один аргумент, вы можете использовать встроенный BOOL функции

category_list = filter(bool, category_list) 
+1

https://docs.python.org/2/library/functions.html#filter – Shashank

+1

О, спасибо, что я не знал об этом. –

2

Использование Dict понимания с is not None проверки:

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

Из документации на dict comprehensions

+0

Я пробовал это, и результат все тот же. Я использовал «complete_dict2 = {к: v для K, V в complete_dict.iteritems(), если v не является None}» complete_dict является ДИКТ после того, как сжать два списка вместе – JChao

Смежные вопросы