2013-05-03 146 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部電影IDS的設置與彼此。但是一定是錯誤的,因爲第一個密鑰必須與第二個密鑰覈對,然後第一個密鑰與第三個密鑰覈對,直到密鑰用完,然後第二個密鑰用第三個密鑰,依此類推,直到我沒有更多密鑰。那麼這是第三個關鍵的轉折點。

最後我只想得到至少有兩部電影共同的鑰匙。

我試着這樣做:

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 2013-05-03 23:10:07

+0

是的,它將所有字典相互比較,並且返回語句確保它不返回與自己配對的字典。 – James 2013-05-03 23:18:26

+0

非常感謝你!!!最後一件快速的事情,它返回1,2和2,1 ......但我認爲它們是一樣的。 – Mirimari 2013-05-03 23:41:10