2013-05-03 4 views
1

Я работаю над этой проблемой, кажется, очень долго. У меня есть словарь, который выглядит следующим образом:сравнить словарь предметов в словаре

{'1': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5,'The Night Listener': 3.0}, '2': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5,'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0,'You, Me and Dupree': 3.5},'3': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,'Superman Returns': 3.5, 'The Night Listener': 4.0}} 

И на самом деле вещь намного больше, но то, что я пытаюсь найти список или установить с парой идентификаторов, которые имеют по крайней мере, 2 фильма общих друг с другом. Но что-то должно быть неправильным, потому что первый ключ должен проверяться со вторым, затем первым ключом с третьим, до тех пор, пока не закончится клавиша, а затем второй ключ с третьим ключом и так далее, пока у меня не будет больше ключей. Затем это поворот третьего ключа.

Наконец-то я хочу получить только ключи, имеющие как минимум 2 фильма.

Я попытался сделать это:

def sim_critics(movies): 
    similarRaters=set() 

    first=1 
    lastCritic= '' 

    movie_over = collections.defaultdict(list) 
    movCount=Counter(movie for v in movies.values() for movie in v) 

    for num in movies: 
     for movie, _ in movies[num].items(): 
      movie_over[movie].append(num) 


    for critic,_ in movie_over.items(): 
     if first!=1: 
      critic_List = collections.Counter(movie_over[critic]) 
      critic2_list = collections.Counter(movie_over[lastCritic]) 
      overlap = list((critic_List & critic2_list).elements()) 

      if len(overlap) >= 2: 
       key = critic + " and " + lastCritic 
       similarRaters.add(key) 
     lastCritic= critic 
     first=2 
    return similarRaters 

ответ

1

простым решением было бы сделать это:

def simCritics(movies): 
    matchingDicts = set() 
    for m in movies: 
     for i in movies: 
      if (len(m) + len(i)) > len(set(m).union(i)): 
       matchingDicts.add((m, i)) 

    myList = [i for i in list(matchingDicts) if i[0] != i[1]] 

    myL = [] 
    for i in myList: 
     if (i[1], i[0]) in myL: 
      continue 
     myL.append(i) 
    return myL 

Сравнение в середине (тот, который сравнивает LEN) имеет решающее значение, потому что если фильмы перекрываются, у них будет хотя бы один идентичный ключ, поэтому объединение (которое удаляет дубликаты) будет меньше суммы.

+0

Спасибо! Но у меня есть вопрос, проверяет ли он между первым-вторым словарем первой трети? – Mirimari

+0

Да, он сравнивает все словари друг с другом, и оператор return гарантирует, что он не вернет словари, которые связаны друг с другом. – James

+0

Огромное вам спасибо! Одна из последних быстрых вещей, она возвращает 1,2 и 2,1 ... но я думаю, что они одинаковы. – Mirimari

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