#python #python-2.7 #python-3.x #filter #nested-lists
#python #python-2.7 #python-3.x #Фильтр #вложенные списки
Вопрос:
Я хочу вернуть все подсписки списков, которые содержат определенную подстроку в определенном столбце:
Например:
List=[["2006ab","2005ac"],["2005ab","2004ac"],["2006ab","2005ac"],["2006ab","2003ac"],["2006ab","2005ac"]]
Критерии поиска: вернуть все подсписки, содержащие подстроку 2005 по 2-му индексу .
Вывод :
[["2006ab","2005ac"],["2006ab","2005ac"],["2006ab","2005ac"]]
Я попытался использовать :
matching = [s for s in List if "2005" in s[1]]
но он возвращает:
[["2006ab","2005ac"],["2005ab","2004ac"],["2006ab","2005ac"],["2006ab","2005ac"]]
Комментарии:
1. да, но 2005 также может иметь 0-й индекс подсписка, но я намерен вернуть все подсписки, только если он содержит 2005 в 1-м индексе подсписков.
2. Запустите его снова. В вашем коде нет ничего плохого.
3. Ваш код дает правильный результат.
[s for s in List if "2005" in s[1]]
выдает[['2006ab', '2005ac'], ['2006ab', '2005ac'], ['2006ab', '2005ac']]
.
Ответ №1:
Ваш подход к пониманию списка хорош и дает правильный результат. Вы уверены, что ваш код тот же, из которого вы вставили выходные данные, потому что он работает для меня:
>>> List=[["2006ab","2005ac"],["2005ab","2004ac"],["2006ab","2005ac"],["2006ab","2003ac"],["2006ab","2005ac"]]
>>> [sublist for sublist in List if '2005' in sublist[1]]
[['2006ab', '2005ac'], ['2006ab', '2005ac'], ['2006ab', '2005ac']]
что совпадает с тем, что вы хотите.
Если вы ищете альтернативу, вы можете использовать filter()
>>> filter(lambda x: '2005' in x[1], List)
[['2006ab', '2005ac'], ['2006ab', '2005ac'], ['2006ab', '2005ac']]
Комментарии:
1. Разве это не тот же код, что и у него, просто замена
s
наsublist
?2. Это ничем не отличается от кода OP, кроме переименования
s
вsublist
. В чем смысл вашего ответа?3. Обновлен ответ. Поскольку вопрос был неправильно отформатирован, я пропустил последнюю часть
4. Если вам нужен фильтр лямбда, понимание списка более идиоматично. Я думаю, вы неправильно
filter
поняли. Аргумент функции должен возвращать только true или false:lambda x: '2005' in x[1]
. Нет причины для троичного выражения.5. @StevenRumbalski: Спасибо, что поправили меня. И да, мое понимание
filter()
было неправильным до настоящего времени 🙂