【发布时间】:2023-01-05 20:30:12
【问题描述】:
我需要编写一个函数来查找具有最共同爱好的一对夫妇,即这对夫妇的共同爱好与不同爱好的比率应该最高。如果多对具有相同的最佳比率,则返回哪对并不重要,唯一的例外是当多对共享他们的所有爱好时,在这种情况下,将返回具有最多共享爱好的一对。
def find_two_people_with_most_common_hobbies(data: str) -> tuple:
new_dict = create_dictionary(data) # creates a dictionary in the form {name1: [hobby1, hobby2, ...], name2: [...]}
value_list = [] # list that stores all hobbies, duplicates included
for value in new_dict.items():
for ele in value[1]:
value_list.append(ele)
filtered_list = set([x for x in value_list if value_list.count(x) > 1]) # list where hobbies appear more than once, no duplicates
return tuple([k for k, v in new_dict.items() if set(v).intersection(filtered_list)])
所以,给定输入"John:running\nJohn:walking\nMary:dancing\nMary:running\nNora:running\nNora:singing\nNora:dancing",输出应该是('Mary', 'Nora')。我的代码返回 ('John', 'Mary', 'Nora'),因为它会查找字典中的值与筛选列表中的值之间的交集。我不明白如何让它只返回共同的爱好。
【问题讨论】:
-
如果您自己查看输入并尝试手动解决问题,您如何决定输出应该是 Mary 和 Nora?如何在代码中执行相同的步骤?您编写的代码似乎更像是一种询问“谁与其他人有共同爱好?”的解决方案。我们假设
create_dictionary工作正常,因此您可能应该分享分配给new_dict的示例字典是什么,并将函数调用留在示例之外。 -
@Grismar 关于我的代码的作用,你是对的。它真的只适合那些有共同爱好的人。字典看起来像这样
{'John': ['running', 'walking'], 'Mary': ['dancing', 'running'], 'Nora': ['running', 'singing', 'dancing' ]}。 -
一些旁注改进:1) 通过将
set(v).intersection(filtered_list)替换为not filtered_list.isdisjoint(v)来获得短路和更高的效率(后者避免二每次调用临时sets,并且可以在找到第一个重叠元素时立即停止处理,即使第一个测试元素存在重叠,交集也必须运行完成)。 2)写setcomps,不要setify listcomps:{x for x in value_list if value_list.count(x) > 1}。更好的是{x for x, cnt in collections.Counter(value_list).items() if cnt > 1}。
标签: python python-3.x dictionary