Однострочный код python для возврата всех подсписков списка, содержащих определенную подстроку в отдельном столбце

#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() было неправильным до настоящего времени 🙂