Отфильтровать список списков, используя понимание списка в Python

59
9

У меня есть список списков (показано ниже), которые я бы хотел отфильтровать на основе первого элемента каждого списка.

raw_json = [[u'2014-09-09', u'18:00:00', 81, 1, u'codereview.stackexchange.com', u'Engineering & Technology', 1], [u'2014-09-09', u'18:00:00', 79, 1, u'google.com', u'Search', 0], [u'2014-09-11', u'23:00:00', 44, 1, u'newtab', u'Browsers', 0], [u'2014-09-11', u'23:00:00', 44, 1, u'iTunes', u'Music', -2], [u'2014-09-11', u'23:00:00', 24, 1, u'google.com', u'Search', 0], [u'2014-09-11', u'23:00:00', 22, 1, u'effbot.org', u'Search', 0], [u'2014-09-11', u'23:00:00', 3, 1, u'spotify', u'General Entertainment', -2], [u'2014-09-11', u'23:00:00', 2, 1, u'calendar.boston.com', u'Regional', -2]]

Короче говоря, я хотел бы иметь возможность фильтровать для сегодняшней даты так идеально, что я бы вернулся ко мне, который выглядит так:

result = [[u'2014-09-11', u'23:00:00', 44, 1, u'newtab', u'Browsers', 0], [u'2014-09-11', u'23:00:00', 44, 1, u'iTunes', u'Music', -2], [u'2014-09-11', u'23:00:00', 24, 1, u'google.com', u'Search', 0], [u'2014-09-11', u'23:00:00', 22, 1, u'effbot.org', u'Search', 0], [u'2014-09-11', u'23:00:00', 3, 1, u'spotify', u'General Entertainment', -2], [u'2014-09-11', u'23:00:00', 2, 1, u'calendar.boston.com', u'Regional', -2]]

Я написал следующий код, но продолжаю получать сообщение об ошибке, TypeError: list indices must be integers, not list

today = date.today().isoformat()
today_raw_json = [i for i in raw_json if today==raw_json[i][0]]
print today_raw_json

Если кто-то может помочь мне понять, что я делаю неправильно, я бы очень признателен.

спросил(а) 2014-09-12T07:19:00+04:00 6 лет, 1 месяц назад
1
Решение
58

Вы хотите:

[i for i in raw_json if i[0] == today]

i - это фактический элемент в списке, а не его индекс.

ответил(а) 2014-09-12T07:24:00+04:00 6 лет, 1 месяц назад
41

Вы можете использовать встроенную функцию filter. Синтаксис:

filter(function, sequence)

Итак, ваш код будет выглядеть так:

filter(lambda x:x[0] == today, raw_json)

PS Я знаю, что вы предпочтете использовать списки, но я думаю, что фильтр сделает код более читаемым.

ответил(а) 2014-09-13T03:00:00+04:00 6 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема