交叉两个字典并获得平均分数
Intersecting two Dictionaries and getting average scores
我有2本python本词典,每本词典都有一个城市名称和该城市的分数。
我需要比较两个词典以找到最大 score.Hence 的城市,为此我首先取两个词典的交集以获得共同点 cities.This 是我面临的问题。
例如,假设两个词典是:
d1 = {"delhi": 40, "Jaipur": 50, "Gurgaon": 10}
d2 = {"Jaipur(Rajasthan)": 30, "Gurugram(Gurgaon)": 25}
此处由于括号或城市有一些额外的字符串,交集失败。
所以我的问题是,如果一个城市部分出现在字符串中,是否有任何方法将其带入交叉路口?
还有,最后我要给这个城市一个平均分
我希望最终结果是:
d3 = {"gurgaon": 17.5((10 + 25) / 2), "jaipur": 40(80 / 2)}
我该如何实现?
如果你只需要比较两个字典,你可以使用过滤函数做这样的事情:
def get_avg_scores(d1, d2):
d3 = {}
for key, item in d1.items():
# Get match key d1 vs. d2
d2_similar_key = list(filter(lambda x: key.lower() in x.lower(), d2.keys()))
#Get match key d2 vs. d1
d2_similar_key_rev = list(filter(lambda x: x.lower() in key.lower(), d2.keys()))
# Keep the simplest key (to avoid bracets in d3)
if len(d2_similar_key) > 0:
d3[key] = (item + d2[d2_similar_key[0]])/2
if len(d2_similar_key_rev) > 0:
d3[d2_similar_key_rev[0]] = (item + d2[d2_similar_key_rev[0]])/2
return d3
d3 = get_avg_scores(d1, d2)
您可以创建规范化的字典,其中用于匹配的键是从原始键中提取的。由于输入字典的键中括号内和括号外的名称都可以用于匹配,因此在规范化字典中为两个名称创建冗余键:
import re
n1, n2 = (
{t.lower(): v for k, v in d.items() for t in re.findall('[^()]+', k)}
for d in (d1, d2)
)
print({k: (n1[k] + n2[k]) / 2 for k in n1.keys() & n2.keys()})
这输出:
{'gurgaon': 17.5, 'jaipur': 40.0}
我有2本python本词典,每本词典都有一个城市名称和该城市的分数。 我需要比较两个词典以找到最大 score.Hence 的城市,为此我首先取两个词典的交集以获得共同点 cities.This 是我面临的问题。 例如,假设两个词典是:
d1 = {"delhi": 40, "Jaipur": 50, "Gurgaon": 10}
d2 = {"Jaipur(Rajasthan)": 30, "Gurugram(Gurgaon)": 25}
此处由于括号或城市有一些额外的字符串,交集失败。
所以我的问题是,如果一个城市部分出现在字符串中,是否有任何方法将其带入交叉路口?
还有,最后我要给这个城市一个平均分
我希望最终结果是:
d3 = {"gurgaon": 17.5((10 + 25) / 2), "jaipur": 40(80 / 2)}
我该如何实现?
如果你只需要比较两个字典,你可以使用过滤函数做这样的事情:
def get_avg_scores(d1, d2):
d3 = {}
for key, item in d1.items():
# Get match key d1 vs. d2
d2_similar_key = list(filter(lambda x: key.lower() in x.lower(), d2.keys()))
#Get match key d2 vs. d1
d2_similar_key_rev = list(filter(lambda x: x.lower() in key.lower(), d2.keys()))
# Keep the simplest key (to avoid bracets in d3)
if len(d2_similar_key) > 0:
d3[key] = (item + d2[d2_similar_key[0]])/2
if len(d2_similar_key_rev) > 0:
d3[d2_similar_key_rev[0]] = (item + d2[d2_similar_key_rev[0]])/2
return d3
d3 = get_avg_scores(d1, d2)
您可以创建规范化的字典,其中用于匹配的键是从原始键中提取的。由于输入字典的键中括号内和括号外的名称都可以用于匹配,因此在规范化字典中为两个名称创建冗余键:
import re
n1, n2 = (
{t.lower(): v for k, v in d.items() for t in re.findall('[^()]+', k)}
for d in (d1, d2)
)
print({k: (n1[k] + n2[k]) / 2 for k in n1.keys() & n2.keys()})
这输出:
{'gurgaon': 17.5, 'jaipur': 40.0}