2016-11-15 3 views
1

Немного нечетного Я получил здесь ...Проверить элемент в нескольких списках внутри списка

В основном говорят, что у меня есть список со списками внутри него.

ratings = [ 
    # ''' 1 star ''' 
    ["Strangers on a Train", "Anchorman", "Saw", "Suicide Squad"], 

    # ''' 2 star ''' 
    ["Shutter Island", "Shaun of the Dead", "Scream", "Indiana Jones"], 

    # ''' 3 star''' 
    ["Goodfellas", "Mr Bean", "The Ring", "Dark Knight"], 

    # ''' 4 star''' 
    ["Scarface", "Hot Fuzz", "Nosferatu", "Die Hard"], 

    # ''' 5 star''' 
    ["Pulp Fiction", "Airplane", "The Omen", "Deadpool"] 
] 

Очевидно, что это список фильмов, и в списке 5 списков дает каждому из фильмов рейтинговую из 5, хотя этот контекст совершенно бесполезно.

def rating(): 
    if userInfo[7] == "1": 
     return range(5) 
    elif userInfo[7] == "2": 
     return range(2, 5) 
    elif userInfo[7] == "3": 
     return range(3, 5) 
    elif userInfo[7] == "4": 
     return range(4, 5) 
    else: 
     return range(5, 5) 

Вот функция, где по существу диапазон возвращается в зависимости от того, какой минимальный рейтинг фильма они хотели бы видеть это. Так говорят, что их минимальный рейтинг 4, они будут видеть только фильмы рейтинга 4 и 5.

говорит, что у них есть список фильмов

movies = ["Strangers on a Train", "Anchorman", "Shutter Island", 
      "Shaun of the Dead", "Goodfellas", "Mr Bean", 
      "Scarface", "Hot Fuzz", "Pulp Fiction", "Airplane"] 

Теперь я хочу, чтобы удалить все фильмы из этого списка, которые не от номинала 4 или выше.

Я попытался

new = [] 
for item in movies: 
    if item not in in ratings[rating()]: 
     new.append(item) 

, но это не будет работать, как я не могу использовать диапазон для поиска через несколько списков внутри большого списка, как это должно быть целым числом.

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

+0

просто используйте нарезку: 'рейтинги [3:]' предоставит вам все фильмы с рейтингом 4 или выше – acushner

ответ

2

Во-первых, данные рейтингов действительно не оптимальны для поиска результатов. Так что я хотел бы сделать словарь с именами фильмов в качестве ключей и рейтингов, как значения с помощью словаря понимания:

movie_rating = {name:i+1 for i,mlist in enumerate(ratings) for name in mlist} 

(этот словарь можно использовать много раз)

Затем я применяю эти данные второго списка в понимание списка. Неограниченные фильмы получают 0 баллов.

print([x for x in movies if movie_rating.get(x,0) >= 4]) 

Результат:

['Scarface', 'Hot Fuzz', 'Pulp Fiction', 'Airplane'] 

Этот метод не может быть самым коротким, но имеет преимущество, сохраняя точную информацию рейтинг, а не «рейтинги выше п».

Вы можете прочитать о list and dict comprehensions в этом другом SO Q & A. Вопрос уже объясняет, что listcomps очень хорошо, и ответ объясняет dictcomps.

+0

Вы БОГАШН. Это определенно работает, но я серьезно не знаю, что вы сделали, я не могу понять, как выглядит, у вас есть какие-то ресурсы, которые полезны для понимания их? Если вы этого не сделаете, не беспокойтесь об этом и спасибо за ваше время: D –

+0

Я отредактировал мое сообщение, чтобы перейти к большому SO Q & A, там очень ясно. вы можете делать с классическими циклами «для», но listcomps более элегантны, быстро записываются и быстро выполняются. –

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