【问题标题】:Replacing values with dictionary key in python在python中用字典键替换值
【发布时间】:2020-02-19 05:08:33
【问题描述】:

所以我创建了一个包含每个州缩写的字典,键是“East”、“Central”和“West”

states_dict = {
    'West': ["CA","OR","WA","NV","ID","UT","AZ","MT","AK"],
    'Central': ["WY","CO","NM","ND","SD","NE","KS","OK","TX","MN","IA","MO","AR","LA","WI","IL","MS"],
    'East': ["MI","IN","KY","TN","AL","OH","GA","FL","SC","NC","VA","WV","DE","MD","NJ","PA","NY","CT","RI","MA","VT","NH","ME"] 
}

我正在尝试找出一种方法将其应用于一列代码并在列中返回字典键。例如,如果它是 ["CA", "FL"] 我希望列是 ["West","East]。我创建了一个 for 循环,在其中我将键附加到一个新列表中,它的长度不正确,所以我开始使用 .replace,它一直在运行。这是我的代码。

for x in df['X20']:
    for i,j in states_dict.items():
        for v in j:
            if x==v:
                x20=df['X20'].replace(x,i)

            else:
                pass
x20

【问题讨论】:

标签: python dictionary


【解决方案1】:

不确定您是否需要,但很容易反转您的键/值以轻松提取您要查找的数据:

keyed_by_region = {
    'West': ["CA","OR","WA","NV","ID","UT","AZ","MT","AK"],
    'Central': ["WY","CO","NM","ND","SD","NE","KS","OK","TX","MN","IA","MO","AR","LA","WI","IL","MS"],
    'East': ["MI","IN","KY","TN","AL","OH","GA","FL","SC","NC","VA","WV","DE","MD","NJ","PA","NY","CT","RI","MA","VT","NH","ME"] 
}
​
keyed_by_states = {}
for region, states in keyed_by_region.items():
    for state in states:
        keyed_by_states[state] = region
        
print('FL', keyed_by_states['FL'])
print('CA', keyed_by_states['CA'])

佛罗里达州东部

加州西部

【讨论】:

    【解决方案2】:

    您可以执行列表推导来搜索在其值中包含搜索字段的键:

    states_dict = {
        'West': ["CA","OR","WA","NV","ID","UT","AZ","MT","AK"],
        'Central': ["WY","CO","NM","ND","SD","NE","KS","OK","TX","MN","IA","MO","AR","LA","WI","IL","MS"],
        'East': ["MI","IN","KY","TN","AL","OH","GA","FL","SC","NC","VA","WV","DE","MD","NJ","PA","NY","CT","RI","MA","VT","NH","ME"] 
    }
    
    search = ["CA", "FL"] 
    print([k for k, v in states_dict.items() if any(y in v for y in search)])
    # ['West', 'East']
    

    【讨论】:

    • 在这里使用any() 方法有什么意义?如果是这样的话:[ k for k, v in states_dict.items() for y in search if y in v]
    • @IVI,你不会有重复的状态。
    • 这很适合复制为:["CA", "FL", "CA"],但它也会跳过此示例["CA", "FL", "IN"],输出仍将是['West', 'East']
    • @IVI,没错。如果他预期不同,让 OP 进行干预。
    【解决方案3】:

    首先不要循环遍历整个字典 (using states_dict.items()),而是使用键来查找值,因为循环破坏了使用字典的全部目的。

    即你应该改用

    .replace(x,states_dic[<state code>])
    

    用代表状态码的变量代替

    但为此,您必须将字典重新制作为

    {<state code>:<east/west/north/south>}
    

    例如:

    new_dict = {'CA':'west','OR':'west'...}
    

    您可以使用现有的字典来做到这一点

    new_dict = {}
    for key, value in states_dict.items():
        for states in value:
             new_dict.update({states:key})
    

    【讨论】: