2016-04-21 16 views
0

Ich arbeite an einem Programm, das eine imdb-Textdatei aufnimmt und die besten Schauspieler (nach Filmauftritten) basierend auf der Benutzereingabe N ausgibt.Elemente in der Tupel-Liste kombinieren?

Allerdings stoße ich auf ein Problem, bei dem ich Ich habe Slots von Schauspielern in der gleichen Menge von Filmen, die ich vermeiden muss. Wenn zwei Schauspieler in 5 Filmen sind, sollte zum Beispiel die Zahl 5 erscheinen und die Namen der Schauspieler sollten durch ein Semikolon getrennt sein.

Ich habe mehrere Umgehungslösungen ausprobiert und nichts hat noch funktioniert. Irgendwelche Vorschläge?

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

alle Ihre Code verschachtelt unter 'wenn __name__ ==„__main __“:' bedeutet, dass Keine der Funktionalitäten ist verfügbar, wenn die Datei von einem anderen Skript importiert wird. – jDo

Antwort

3

Es ist eine nützliche Methode itertools.groupby

Es können Sie die Liste in die Gruppen von einigen Schlüssel teilen können. Mit ihm können Sie eine Funktion leicht schreiben, die Top-Schauspieler druckt:

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) 

und Anwendungsbeispiel:

>>> 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

Ein paar Dinge: Sie rufen top_Actors im Beispiel auf, obwohl Sie print_top_actors definiert haben. Sie sagen auch in Ihrem Kommentar actor_info_list Tupelreihenfolge sollte movie_count, actor name sein, aber im Beispiel kommt der Name des Schauspielers zuerst und dann die Filmanzahl. Wenn der Code wie folgt ausgeführt wird, wird eine Liste im Stil von: (Actorname, Moviecount) actorname zurückgegeben und die Actor-Namen für mich überhaupt nicht kombiniert. –

+0

Mein schlechtes tut mir leid. Beispiel und Kommentar behoben. Die richtige Art zu telefonieren ist wie in Beispiel, obwohl Sie es immer ändern können, Sie müssen nur 'Schlüssel' in' sort'/'groupby' ändern –

Verwandte Themen