2014-02-12 2 views
0

я имею переменную «actorslist» и его выход 100 строк этого (строка для каждого фильма):Создать массив перестановок из списка списков

[u'Tim Robbins', u'Morgan Freeman', u'Bob Gunton', u'William Sadler'] 
[u'Christian Bale', u'Heath Ledger', u'Aaron Eckhart', u'Michael Caine'] 
etc. 

Тогда у меня есть:

pairslist = list(itertools.permutations(actorslist, 2)) 

Это дает мне пары актеров, но только в определенном фильме, а затем после новой строки он переходит к следующему фильму. Как я могу получить его для вывода всех актеров из всех фильмов в одном большом массиве? Идея состоит в том, что два актера, которые были вместе в фильме, должны получить преимущество pydot.

Я положил в это, который успешно выводится в файл точек, но не выводит правильные данные.

graph = pydot.Dot(graph_type='graph', charset="utf8") 
for i in pairslist: 
    edge = pydot.Edge(i[0], i[1]) 
    graph.add_edge(edge) 
    graph.write('dotfile.dot') 

Мой ожидаемый результат должен быть следующим в файле точек (A, B) является такой же, как (B, A) и поэтому не существует на выходе:

"Tim Robbins" -- "Morgan Freeman"; 
"Tim Robbins" -- "Bob Gunton"; 
"Tim Robbins" -- "William Sadler"; 
"Morgan Freeman" -- "Bob Gunton"; 
"Morgan Freeman" -- "William Sadler"; 
"Bob Gunton" -- "William Sadler"; 
"Christian Bale" -- "Heath Ledger"; 
"Christian Bale" -- "Aaron Eckhart"; 
"Christian Bale" -- "Michael Caine"; 
"Heath Ledger" -- "Aaron Eckhart"; 
"Heath Ledger" -- "Michael Caine"; 
"Aaron Eckhart" -- "Michael Caine"; 

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

некоторые были заинтересованы в том, как переменная actorslist была создана:

file = open('input.txt','rU') ###input is JSON data on each line{"Title":"Shawshank... 
nfile = codecs.open('output.txt','w','utf-8') 
movie_actors = [] 
for line in file: 
    line = line.rstrip() 
    movie = json.loads(line) 
    l = [] 
    title = movie['Title'] 
    actors = movie['Actors'] 
    tempactorslist = actors.split(',') 
    actorslist = [] 
    for actor in tempactorslist: 
    actor = actor.strip() 
    actorslist.append(actor) 
    l.append(title) 
    l.append(actorslist) 
    row = l[0] + '\t' + json.dumps(l[1]) + '\n' 
    nfile.writelines(row) 
+0

Можете ли вы, пожалуйста, показать ожидаемый результат? Не совсем понятно, чего вы пытаетесь достичь. – thefourtheye

ответ

1
from collections import Counter 
from itertools import combinations 
import pydot 

actorslists = [ 
    [u'Tim Robbins', u'Morgan Freeman', u'Bob Gunton', u'William Sadler'], 
    [u'Christian Bale', u'Heath Ledger', u'Aaron Eckhart', u'Michael Caine'], 
    [u'Tim Robbins', u'Heath Ledger', u'Michael Caine'] 
] 

# Counter tracks how often each pair of actors has occurred (-> link weight) 
actorpairs = Counter(pair for actorslist in actorslists for pair in combinations(sorted(actorslist), 2)) 

graph = pydot.Dot(graph_type='graph', charset="utf8") 
for actors,weight in actorpairs.iteritems(): # or .items() for Python 3.x 
    a,b = list(actors) 
    edge = pydot.Edge(a, b, weight=str(weight)) 
    graph.add_edge(edge) 
graph.write('dotfile.dot') 

приводит

enter image description here

+0

Спасибо, кажется, мне не хватает модуля комбинаций, возможно, потому, что я запускаю python 2.7. – kegewe

+0

@kegewe: 'itertools.combinations' является частью стандартной библиотеки Python 2.7. –

+0

Извините, мой плохой я делал это неправильно – kegewe

0

Вы хотите что-то вроде этого:

import itertools 

actorslist = [ 
    [u'Tim Robbins', u'Morgan Freeman', u'Bob Gunton', u'William Sadler'], 
    [u'Christian Bale', u'Heath Ledger', u'Aaron Eckhart', u'Michael Caine'] 
    ] 

for movie in actorslist: 
    for actor1, actor2 in itertools.permutations(movie, 2): 
     print(actor1, actor2) 
     # make edge, etc. 

Выход:

Tim Robbins Morgan Freeman 
Tim Robbins Bob Gunton 
Tim Robbins William Sadler 
Morgan Freeman Tim Robbins 
Morgan Freeman Bob Gunton 
Morgan Freeman William Sadler 
Bob Gunton Tim Robbins 
Bob Gunton Morgan Freeman 
Bob Gunton William Sadler 
William Sadler Tim Robbins 
William Sadler Morgan Freeman 
William Sadler Bob Gunton 
Christian Bale Heath Ledger 
Christian Bale Aaron Eckhart 
Christian Bale Michael Caine 
Heath Ledger Christian Bale 
Heath Ledger Aaron Eckhart 
Heath Ledger Michael Caine 
Aaron Eckhart Christian Bale 
Aaron Eckhart Heath Ledger 
Aaron Eckhart Michael Caine 
Michael Caine Christian Bale 
Michael Caine Heath Ledger 
Michael Caine Aaron Eckhart 

То, что вы прямо сейчас перестановкой список фильмов, а не список участников в рамках каждого фильма.

+0

Тот же комментарий, что и выше: моя проблема в том, что переменная 'actlist', которую я имею, не имеет наборов актеров, разделенных запятой, а имеет новую группу участников на каждой строке ... знаете ли вы, как я могу преобразовать эту переменную поэтому он выглядит как ваш сверху – kegewe

+0

@kegewe Что? Каков тип 'actlist'? – senshin

+0

когда я говорю 'print type (playerslist)' Я получаю много строк '' – kegewe

0

Я не уверен, насколько сложным оно должно быть, но это похоже на работу, чтобы сгенерировать вывод. Я только изменил свой пар линий ... (я взял на себя смелость положить Тим Роббинс в Бэтмен, только чтобы придать ему более реалистичное перекрытие)

actorslist = [[u'Tim Robbins', u'Morgan Freeman', u'Bob Gunton', u'William Sadler'], 
    [u'Christian Bale', u'Heath Ledger', u'Tim Robbins', u'Michael Caine']] 

import itertools 
import pydot 
graph = pydot.Dot(graph_type='graph', charset="utf8") 

# generate a list of all unique actors, if you want that 
# allactors = list(set([j for j in [i for i in actorslist]])) 

# this is the key line -- you have to iterate through the list 
# and not try to permute the whole thing 
pairs = [list(itertools.permutations(k, 2)) for k in actorslist] 


for pair in pairs: 
    for a,b in pair: 
     edge = pydot.Edge(a,b) 
     graph.add_edge(edge) 
     graph.write('dotfile.dot') 

Выходного файл (помните, я изменил вход повторно Tim Robbins) .. .

graph G { 
charset=utf8; 
"Tim Robbins" -- "Morgan Freeman"; 
"Tim Robbins" -- "Bob Gunton"; 
"Tim Robbins" -- "William Sadler"; 
"Morgan Freeman" -- "Tim Robbins"; 
"Morgan Freeman" -- "Bob Gunton"; 
"Morgan Freeman" -- "William Sadler"; 
"Bob Gunton" -- "Tim Robbins"; 
"Bob Gunton" -- "Morgan Freeman"; 
"Bob Gunton" -- "William Sadler"; 
"William Sadler" -- "Tim Robbins"; 
"William Sadler" -- "Morgan Freeman"; 
"William Sadler" -- "Bob Gunton"; 
"Christian Bale" -- "Heath Ledger"; 
"Christian Bale" -- "Tim Robbins"; 
"Christian Bale" -- "Michael Caine"; 
"Heath Ledger" -- "Christian Bale"; 
"Heath Ledger" -- "Tim Robbins"; 
"Heath Ledger" -- "Michael Caine"; 
"Tim Robbins" -- "Christian Bale"; 
"Tim Robbins" -- "Heath Ledger"; 
"Tim Robbins" -- "Michael Caine"; 
"Michael Caine" -- "Christian Bale"; 
"Michael Caine" -- "Heath Ledger"; 
"Michael Caine" -- "Tim Robbins"; 
} 
+0

Я думаю, моя проблема в том, что переменная 'actlist'. У меня нет наборов участников, разделенных запятой, а у вас есть новый набор участников на каждой строке ... знаете ли вы, как я могу преобразовать эту переменную, чтобы она выглядела как ваша? – kegewe

Смежные вопросы