2016-11-15 53 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

只是使用切片:'rating [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'] 

這種方法可能不是最短的,但有確切的保存評級信息的優勢,而不是「上述N-評分」。

你可以在這個其他SO Q & A閱讀關於list and dict comprehensions A.這個問題已經解釋了listcomps很好,答案解釋dictcomps。

+0

你是一個GODSEND。這絕對有效,但我真的不知道你做了什麼,看起來我無法理解我的頭腦,你是否有任何有助於理解它們的資源?如果你不這樣做,不要擔心,謝謝你的時間:D –

+0

我已經編輯了我的帖子,鏈接到一個偉大的SO問答,這非常清楚。你可以使用經典的「for」循環,但listcomps更優雅,寫入速度更快,執行速度更快。 –