将部分匹配的情况与Python字典进行匹配

3

乍一看,我认为这是一个简单的问题,但我找不到一个准确适用的答案...

我有一个州名和缩写的字典,如下所示;

{(' ak', ',ak', ', ak', 'juneau', ',alaska', ', alaska'): 'alaska',
 (' al', ',al', ', al', 'montgomery', ',alabama', ', alabama'): 'alabama',
 (' ar', ',ar', ', ar', 'little rock', ',arkansas', ', arkansas'): 'arkansas',
 (' az', ',az', ', az', 'phoenix', ',arizona', ', arizona'): 'arizona',

我正在尝试将此字典映射到我在pandas数据框中拥有的各种自报Twitter位置上,以查找部分匹配项。例如,如果一个案例读取“ anchorage,ak”,它将更改值为阿拉斯加。如果这是一个列表,我可以看到这非常简单,但必须有另一种方法来避免循环。非常感谢您的任何帮助!


你的字符串中的键是否总是用逗号分隔的?对于字符串'anchorage,ak,al',你希望得到什么输出?此外,“更改值”是什么意思? - timgeb
谢谢回复。这是一个公正的观点,我不确定输出会是什么。它是否可以返回第一个成功匹配,比如将',ak'匹配到Alaska?更改值是指更改大小写以匹配字典值。 - puhtiprince
3
我认为在你的字典当前布局下,你无法避免循环(为什么循环是不好的?)- 但是你考虑过像这样构建你的字典吗:{' ak' : 'alaska', ',ak' : 'alaska', ', ak' : 'alaska', ...}?然后你只需通过逗号分隔字符串,并查看结果是否在你的字典中。 - timgeb
1个回答

1

我认为timgeb上面的想法是正确的。 我还要补充两点:

1)在处理之前,您还可以从给定案例中删除所有空格-因此,不需要将' ak'',ak'', ak'全部作为键包括在内-一个简单的'ak'键就足够了。

2)我会创建一个额外的哈希表,将整数映射到州,即{0:'阿拉斯加',1:'阿拉巴马'...},并将相应的整数键存储在原始字典中,而不是在字典中重复州的值。

因此,您的结果字典应该类似于以下内容:

A = {'ak': 0, 'juneau': 0, 'alaska': 0, 'al': 1, 'montgomery': 1, 'alabama': 1, ...}

如果您需要从整数值中访问州名,您应该拥有另一个类似于这样的字典,包含所有50个州:

B = {0: 'alaska', 1: 'alabama',  ...}

所以,考虑到一个案例...
case = 'anchorage,ak'
case_list = case.replace(' ', '').split(',')  # remove all whitespace and split case by comma
for elem in case_list:
    if elem in A:
        # insert code to replace case with B[A[elem]]
        break

工作得非常出色。我应该知道要从case中删除空格,但是没想到。不过还是非常感谢你们两个! - puhtiprince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接