Python 组合元组列表中的元素?
我正在开发一个程序,该程序接收imdb文本文件,并根据用户输入N输出顶级演员(按电影外观) 然而,我遇到了一个问题,在同样数量的电影中,演员占据了我的位置,这是我需要避免的。相反,如果两个演员在5部电影中,例如,数字5应该出现,演员的名字应该合并,用分号分隔 我已经尝试了多种解决方法,但都没有效果。有什么建议吗Python 组合元组列表中的元素?,python,loops,dictionary,append,tuples,Python,Loops,Dictionary,Append,Tuples,我正在开发一个程序,该程序接收imdb文本文件,并根据用户输入N输出顶级演员(按电影外观) 然而,我遇到了一个问题,在同样数量的电影中,演员占据了我的位置,这是我需要避免的。相反,如果两个演员在5部电影中,例如,数字5应该出现,演员的名字应该合并,用分号分隔 我已经尝试了多种解决方法,但都没有效果。有什么建议吗 if __name__ == "__main__": imdb_file = raw_input("Enter the name of the IMDB file ==>
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]
有一个有用的方法
它允许您按某个键将列表拆分为多个组。使用它,您可以轻松编写打印顶级角色的函数:
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
有一个有用的方法
它允许您按某个键将列表拆分为多个组。使用它,您可以轻松编写打印顶级角色的函数:
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
如果将所有代码嵌套在
if\uuuuu name\uuuu==“\uuuuu main\uuuu”:
意味着如果文件由另一个脚本导入,则其任何功能都无法访问。如果将所有代码嵌套在if\uuuuuu name\uuuuu==“\uuuuuuuu main\uuu”下:
意味着如果文件由另一个脚本导入,它的任何功能都将无法访问。两件事:在示例中,您调用top_Actors,即使您定义了print_top_Actors,您也会在注释中说actor_info_list元组顺序应该是movie_count、actor name、,然而,在这个例子中,演员的名字排在电影的前面。按原样运行代码会返回一个样式为:(Actorname,moviecount)Actorname的列表,对我来说根本不会组合演员名称。我很抱歉。修复了示例和注释。正确的调用方式如示例所示,尽管您可以随时更改它,但只需更改排序中的键
/分组方式
两件事:您在示例中调用顶级演员,即使您定义了打印顶级演员,您在注释中也会说演员信息列表元组顺序应该是电影计数、演员名称,然而,在这个例子中,演员的名字排在电影的前面。按原样运行代码会返回一个样式为:(Actorname,moviecount)Actorname的列表,对我来说根本不会组合演员名称。我很抱歉。修复了示例和注释。正确的调用方式如示例所示,尽管您可以随时更改它,但只需在排序中更改键