我似乎已经研究这个问题很长时间了。我有一本看起来像这样的字典:
{'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 部电影共同点的 id 对的列表或集合。但一定有问题,因为第一个 key 必须与第二个 key 检查,然后第一个 key 与第三个 key 检查,直到 key 用完,然后第二个 key 与第三个 key 检查,依此类推,直到我没有更多的 key 。然后轮到第三把 key 了。
最后,我只想获取至少有 2 部电影相同的 key 。
我尝试这样做:
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
最佳答案
一个简单的解决方案是这样做:
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 的比较)至关重要,因为如果电影重叠,它们将至少有一个相同的键,因此并集(删除重复项)将小于总和。
关于python - 比较字典中项目的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16368588/