【问题标题】:Combine elements in list of Tuples?合并元组列表中的元素?
【发布时间】:2016-08-15 06:58:51
【问题描述】:

我正在开发一个程序,该程序接收一个 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]

【问题讨论】:

  • 将所有代码嵌套在if __name__ == "__main__": 下意味着如果文件由另一个脚本导入,则无法访问其所有功能。

标签: python loops dictionary append tuples


【解决方案1】:

有一个有用的方法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

【讨论】:

  • 几件事:即使您定义了 print_top_actors,您在示例中也调用了 top_Actors,您还在评论中说 actor_info_list 元组顺序应该是电影计数,演员姓名,但在示例中演员姓名在前,然后是电影数数。按原样运行代码会返回以下样式的列表:(Actorname, moviecount) actorname,并且对我来说根本不组合演员名称。
  • 对不起。固定示例和评论。正确的调用方式如示例,虽然你总是可以改变它,你只需要在sort/groupby中更改key
猜你喜欢
  • 2021-06-15
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 2013-09-03
  • 2020-05-22
  • 1970-01-01
相关资源
最近更新 更多