Как выбрать из списка списков по условию?

Имеется список:

spisok = [
    ['январь', 31], 
    ['февраль', 28], 
    ['март', 31], 
    ['апрель', 30], 
    ['май', 31],
    ['июнь', 30], 
    ['июль', 31], 
    ['август', 31], 
    ['сентябрь', 30], 
    ['октябрь', 31],
    ['ноябрь', 30], 
    ['декабрь', 31]
]
  1. Необходимо вывести список, где в месяце 31 день;
  2. Необходимо вывести список, где название месяца не заканчивается на мягкий знак.

Перебирал разные варианты, например:

def sortSort3(spisok):
    i = 0
    j = 31

    for j in spisok[i]:
        if j in spisok[i]:
            return(spisok[i][0])
            i = + 1    

print(sortSort3(spisok))

Но запутался в логике. Как это сделать?


Ответы (3 шт):

Автор решения: Jack_oS
my_list = [['январь', 31], ['февраль', 28], ['март', 31], ['апрель', 30], ['май', 31], ['июнь', 30], ['июль', 31], ['август', 31], ['сентябрь', 30], ['октябрь', 31], ['ноябрь', 30], ['декабрь', 31]]

Название не заканчивается мягким знаком:

for m in my_list:
    if not m[0].endswith('ь'):
        print(m)
['март', 31]
['май', 31]
['август', 31]

Количество дней равно 31:

for m in my_list:
    if m[1] == 31:
        print(m)
['январь', 31]
['март', 31]
['май', 31]
['июль', 31]
['август', 31]
['октябрь', 31]
['декабрь', 31]
→ Ссылка
Автор решения: TigerTV.ru

Можно через filter:

*res, = filter(lambda x: x[1] == 31, spisok)
print(res)

*res, = filter(lambda x: x[0][-1] != 'ь', spisok)
print(res)
→ Ссылка
Автор решения: Xander

Выше уже привели хороший вариант с filter, но я рекомендую вместо него использовать вариант с list comprehention - он эквивалентен в плане логике, но более pythonic-style

data = [
    ['январь', 31], 
    ['февраль', 28], 
    ['март', 31], 
    ['апрель', 30], 
    ['май', 31],
    ['июнь', 30], 
    ['июль', 31], 
    ['август', 31], 
    ['сентябрь', 30], 
    ['октябрь', 31],
    ['ноябрь', 30], 
    ['декабрь', 31]
]


print([item for item in data if item[1] == 31])

print([item for item in data if not item[0].endswith('ь')])
→ Ссылка