2016-04-21 244 views
0

我正在研究一個程序,該程序需要一個imdb文本文件,並根據用戶輸入N輸出頂級演員(通過電影出場)。在元組列表中組合元素?

然而,我遇到了一個問題,我有相同數量的電影中有演員佔用的插槽,這是我需要避免的。相反,如果兩個演員在5部電影中,例如5號應該出現,並且演員姓名應該合併,用分號分隔。

我已經嘗試了多種解決方法,並沒有任何工作。有什麼建議麼?

if __name__ == "__main__": 
    imdb_file = raw_input("Enter the name of the IMDB file ==> ").strip() 
    print imdb_file 
    N= input('Enter the number of top individuals ==> ') 
    print N 


    actors_to_movies = {} 

    for line in open(imdb_file): 
     words = line.strip().split('|') 
     actor = words[0].strip() 
     movie = words[1].strip() 
     if not actor in actors_to_movies: 
      actors_to_movies[actor] = set() 
     actors_to_movies[actor].add(movie) 

    movie_list= sorted(list(actors_to_movies[actor])) 

    #Arranges Dictionary into List of Tuples# 
    D = [ (x, actors_to_movies[x]) for x in actors_to_movies] 
    descending = sorted(D, key = lambda x: len(x[1]), reverse=True) 

    #Prints Tuples in Descending Order N number of times (User Input)# 
    for i in range(N): 
     print str(len(descending[i][1]))+':', descending[i][0] 
+0

擁有所有的代碼在'嵌套的,如果__name__ ==「__main __」:'意味着,如果文件是由另一個腳本導入的,則它的功能都不可訪問。 – jDo

回答

3

有一個有用的方法itertools.groupby

它可以讓你通過一些關鍵的名單分成組。使用它可以很容易地編寫打印頂級演員的函數:

import itertools 
def print_top_actors(actor_info_list, top=5): 
    """ 
    :param: actor_info_list should contain tuples of (actor_name, movie_count) 
    """ 
    actor_info_list.sort(key=lambda x: x[1], reverse=True) 
    for i, (movie_count, actor_iter) in enumerate(itertools.groupby(actor_info_list)): 
     if i >= top: 
      break 
     print movie_count, ';'.join(actor for actor, movie_count in actor_iter) 

和示例用法:

>>> print_top_actors(
...  [ 
...   ("DiCaprio", 100500), 
...   ("Pitt", 100500), 
...   ("foo", 10), 
...   ("bar", 10), 
...   ("baz", 10), 
...   ("qux", 3), 
...   ("lol", 1) 
...  ], top = 3) 
100500 DiCaprio;Pitt 
10 foo;bar;baz 
3 qux 
+0

幾件事情:即使您定義了print_top_actors,您也可以在示例中調用top_Actors,您也可以在您的評論中說actor_info_list中的元組順序應該是movie_count,演員姓名,但在示例中,演員名稱首先是影片數量。按照原樣運行代碼會返回一個樣式爲((Actorname,moviecount)actorname)的列表,並且根本不會爲演員姓名組合。 –

+0

我不好意思。修正了例子和評論。正確的調用方式與示例一樣,儘管您可以隨時更改它,但您只需要在'sort' /'groupby'中更改'key' –