通过交叉引用三个词典来创建元组列表

时间:2017-12-07 04:30:07

标签: python list dictionary graph tuples

我一直在尝试创建凯文培根游戏,我想我差不多完成了。但是我在从某些文件构建图表时遇到问题。有三个文件,一个具有actor id然后是actor名称的actor文件,一个具有movie id和movie name的movie文件,以及一个具有movie id和actor id的movie-actor文件。

这些是我创建的测试文件:

注意:打开这些文件时,您可能需要指定编码,以便Python不会崩溃:例如打开(r“actors.txt”,“r”,encoding =“latin-1”)

actorsTest

moviesTest

movies-actorsTest

我想使用这些文件来创建一个顶点是actor名称的图形。

喜欢如此:

顶点:   “Kevin Bacon”,“actor1”,“actor2”,“actor3”,“actor4”,“actor5”,“actor6”]

边缘是由第一个演员,第二个演员和电影片名组成的元组。

像这样:

边缘:

(“Kevin Bacon”,“actor1”,“movie1”)

(“Kevin Bacon”,“actor2”,“movie1”)

(“actor1”,“actor2”,“movie1”)

(“actor1”,“actor3”,“movie2”)

(“actor3”,“actor2”,“movie3”)

(“actor3”,“actor4”,“movie4”)

(“actor5”,“actor6”,“movie5”)

到目前为止,这是我的代码:

with open('actorsTest.txt') as file:
    actors = [l.strip().split('|') for l in file]
#print(actors)  

with open('moviesTest.txt') as file:
    movies = [l.strip().split('|') for l in file]
#print(movies)

with open('movie-actorsTest.txt') as file:
    movie_actors = [l.strip().split('|') for l in file]
#print(movie_actors)

ma_dict = {}
for i in range(len(movie_actors)):
    if movie_actors[i][0] not in ma_dict.keys():
        ma_dict[movie_actors[i][0]] = []

for i in range(len(movie_actors)):
    ma_dict[movie_actors[i][0]].append(movie_actors[i][1])
print(ma_dict)

a_dict = {d[0]: d[1:] for d in actors}
print(a_dict)

m_dict = {d[0]: d[1:] for d in movies}
print(m_dict)



## These code chunks below this statement do not work, they are my attempt 
## at trying to combine the dictionaries to get the edges to be in the 
## correct format.
edges = []

for k, v in ma_dict:
    for i in range(len(v)-1):
        edges.append((a_dict[v[i]], a_dict[v[i+1]], m_dict[k]))
print(edges)

我能够打开文件,逐行解析它们,并创建三个不同的词典。 actors字典将actor id作为键,将actor名称作为值。电影字典将电影ID作为键,电影名称作为值。 movie_actors字典将movie id作为键,并将actor id列表作为值。

如果您希望查看这些文件,可以使用以下实际的actor,movie和movie-actors文件。这些是我将实际运行代码的文件,并创建图表来说明Kevin Bacon的游戏。其他的只是我制作的一些测试文件。

actors

movies

movies-actors

我一直在困惑如何将这三者组合在一起制作边缘和顶点,但到目前为止还没有成功。我感觉它并不那么难,而且有些东西我只是没有看到。

感谢任何建议。

感谢您的时间,如果您需要更多信息,代码段或任何问题,请与我联系。

0 个答案:

没有答案