用字典中的缩写键替换“全名”键

时间:2014-03-23 11:41:42

标签: python python-2.7 dictionary

我有2个词典。

# {state full name: elevation}
elevation = {'Mississippi': 300.0, 'Oklahoma': 1300.0, 'Wyoming': 6700.0, 'Minnesota': 1200.0, 'Illinois': 600.0, 'Arkansas': 650.0, 'New Mexico': 5700.0, 'Ohio': 850.0, 'Indiana': 700.0, 'Maryland': 350.0, 'Louisiana': 100.0, 'Texas': 1700.0, 'Tennessee': 900.0, 'Arizona': 4100.0, 'Iowa': 1100.0, 'Michigan': 900.0, 'Kansas': 2000.0, 'Utah': 6100.0, 'Virginia': 950.0, 'Oregon': 3300.0, 'Connecticut': 500.0, 'Montana': 3400.0, 'California': 2900.0, 'Idaho': 5000.0, 'West Virginia': 1500.0, 'South Carolina': 350.0, 'New Hampshire': 1000.0, 'Massachusetts': 500.0, 'Vermont': 1000.0, 'Georgia': 600.0, 'North Dakota': 1900.0, 'Pennsylvania': 1100.0, 'Florida': 100.0, 'Hawaii': 3030.0, 'Kentucky': 750.0, 'Alaska': 1900.0, 'Nebraska': 2600.0, 'Missouri': 800.0, 'Wisconsin': 1050.0, 'Alabama': 500.0, 'Rhode Island': 200.0, 'South Dakota': 2200.0, 'Colorado': 6800.0, 'New Jersey': 250.0, 'Washington': 1700.0, 'North Carolina': 700.0, 'New York': 1000.0, 'Nevada': 5500.0, 'Delaware': 60.0, 'Maine': 600.0}

# {abbreviation:full name}
postal = {'WA': 'WASHINGTON', 'VA': 'VIRGINIA', 'DE': 'DELAWARE', 'DC': 'DISTRICT OF COLUMBIA', 'WI': 'WISCONSIN', 'WV': 'WEST VIRGINIA', 'HI': 'HAWAII', 'FL': 'FLORIDA', 'FM': 'FEDERATED STATES OF MICRONESIA', 'WY': 'WYOMING', 'NH': 'NEW HAMPSHIRE', 'NJ': 'NEW JERSEY', 'NM': 'NEW MEXICO', 'TX': 'TEXAS', 'LA': 'LOUISIANA', 'NC': 'NORTH CAROLINA', 'ND': 'NORTH DAKOTA', 'NE': 'NEBRASKA', 'TN': 'TENNESSEE', 'NY': 'NEW YORK', 'PA': 'PENNSYLVANIA', 'CA': 'CALIFORNIA', 'NV': 'NEVADA', 'PW': 'PALAU', 'GU': 'GUAM GU', 'CO': 'COLORADO', 'VI': 'VIRGIN ISLANDS', 'AK': 'ALASKA', 'AL': 'ALABAMA', 'AS': 'AMERICAN SAMOA', 'AR': 'ARKANSAS', 'VT': 'VERMONT', 'IL': 'ILLINOIS', 'GA': 'GEORGIA', 'IN': 'INDIANA', 'IA': 'IOWA', 'OK': 'OKLAHOMA', 'AZ': 'ARIZONA', 'ID': 'IDAHO', 'CT': 'CONNECTICUT', 'ME': 'MAINE', 'MD': 'MARYLAND', 'MA': 'MASSACHUSETTS', 'OH': 'OHIO', 'UT': 'UTAH', 'MO': 'MISSOURI', 'MN': 'MINNESOTA', 'MI': 'MICHIGAN', 'MH': 'MARSHALL ISLANDS', 'RI': 'RHODE ISLAND', 'KS': 'KANSAS', 'MT': 'MONTANA', 'MP': 'NORTHERN MARIANA ISLANDS', 'MS': 'MISSISSIPPI', 'PR': 'PUERTO RICO', 'SC': 'SOUTH CAROLINA', 'KY': 'KENTUCKY', 'OR': 'OREGON', 'SD': 'SOUTH DAKOTA'}

我想创建一个新的词组,所以它需要{abbreviation:elevation} ,而新词典中的键必须同时出现在" elevation"和" postal",类似于:

{'MS': 300.0, 'OK': 1300.0, 'WY': 6700.0, 'MN': 1200.0, ....}

我写了这个函数:

def rekeyDict(dct,mapping):
    newDict = {}
    for key in dct.keys():
        try:
            newDict[mapping[key.upper()]] = dct[key]
        except Exception, error:
            print "failed",error
            pass
    return newDict

elevation = rekeyDict(elevation,postal)
print elevation
然而,它给了我一个空白的词。我该如何修复我的代码?

4 个答案:

答案 0 :(得分:3)

elevation = {'Mississippi': 300.0, 'Oklahoma': 1300.0, 'Wyoming': 6700.0, 'Minnesota': 1200.0, 'Illinois': 600.0, 'Arkansas': 650.0, 'New Mexico': 5700.0, 'Ohio': 850.0, 'Indiana': 700.0, 'Maryland': 350.0, 'Louisiana': 100.0, 'Texas': 1700.0, 'Tennessee': 900.0, 'Arizona': 4100.0, 'Iowa': 1100.0, 'Michigan': 900.0, 'Kansas': 2000.0, 'Utah': 6100.0, 'Virginia': 950.0, 'Oregon': 3300.0, 'Connecticut': 500.0, 'Montana': 3400.0, 'California': 2900.0, 'Idaho': 5000.0, 'West Virginia': 1500.0, 'South Carolina': 350.0, 'New Hampshire': 1000.0, 'Massachusetts': 500.0, 'Vermont': 1000.0, 'Georgia': 600.0, 'North Dakota': 1900.0, 'Pennsylvania': 1100.0, 'Florida': 100.0, 'Hawaii': 3030.0, 'Kentucky': 750.0, 'Alaska': 1900.0, 'Nebraska': 2600.0, 'Missouri': 800.0, 'Wisconsin': 1050.0, 'Alabama': 500.0, 'Rhode Island': 200.0, 'South Dakota': 2200.0, 'Colorado': 6800.0, 'New Jersey': 250.0, 'Washington': 1700.0, 'North Carolina': 700.0, 'New York': 1000.0, 'Nevada': 5500.0, 'Delaware': 60.0, 'Maine': 600.0}
postal = {'WA': 'WASHINGTON', 'VA': 'VIRGINIA', 'DE': 'DELAWARE', 'DC': 'DISTRICT OF COLUMBIA', 'WI': 'WISCONSIN', 'WV': 'WEST VIRGINIA', 'HI': 'HAWAII', 'FL': 'FLORIDA', 'FM': 'FEDERATED STATES OF MICRONESIA', 'WY': 'WYOMING', 'NH': 'NEW HAMPSHIRE', 'NJ': 'NEW JERSEY', 'NM': 'NEW MEXICO', 'TX': 'TEXAS', 'LA': 'LOUISIANA', 'NC': 'NORTH CAROLINA', 'ND': 'NORTH DAKOTA', 'NE': 'NEBRASKA', 'TN': 'TENNESSEE', 'NY': 'NEW YORK', 'PA': 'PENNSYLVANIA', 'CA': 'CALIFORNIA', 'NV': 'NEVADA', 'PW': 'PALAU', 'GU': 'GUAM GU', 'CO': 'COLORADO', 'VI': 'VIRGIN ISLANDS', 'AK': 'ALASKA', 'AL': 'ALABAMA', 'AS': 'AMERICAN SAMOA', 'AR': 'ARKANSAS', 'VT': 'VERMONT', 'IL': 'ILLINOIS', 'GA': 'GEORGIA', 'IN': 'INDIANA', 'IA': 'IOWA', 'OK': 'OKLAHOMA', 'AZ': 'ARIZONA', 'ID': 'IDAHO', 'CT': 'CONNECTICUT', 'ME': 'MAINE', 'MD': 'MARYLAND', 'MA': 'MASSACHUSETTS', 'OH': 'OHIO', 'UT': 'UTAH', 'MO': 'MISSOURI', 'MN': 'MINNESOTA', 'MI': 'MICHIGAN', 'MH': 'MARSHALL ISLANDS', 'RI': 'RHODE ISLAND', 'KS': 'KANSAS', 'MT': 'MONTANA', 'MP': 'NORTHERN MARIANA ISLANDS', 'MS': 'MISSISSIPPI', 'PR': 'PUERTO RICO', 'SC': 'SOUTH CAROLINA', 'KY': 'KENTUCKY', 'OR': 'OREGON', 'SD': 'SOUTH DAKOTA'}

newDict = {}
for key, value in postal.iteritems():
    newDict[key] = elevation.get(value.title())

<强>输出:

{'AK': 1900.0, 'AL': 500.0, 'AR': 650.0, 'AS': None, 'AZ': 4100.0, 'CA': 2900.0, 'CO': 6800.0, 'CT': 500.0, 'DC': None, 'DE': 60.0, 'FL': 100.0, 'FM': None, 'GA': 600.0, 'GU': None, 'HI': 3030.0, 'IA': 1100.0, 'ID': 5000.0, 'IL': 600.0, 'IN': 700.0, 'KS': 2000.0, 'KY': 750.0, 'LA': 100.0, 'MA': 500.0, 'MD': 350.0, 'ME': 600.0,'MH': None, 'MI': 900.0, 'MN': 1200.0, 'MO': 800.0, 'MP': None, 'MS': 300.0, 'MT': 3400.0, 'NC': 700.0, 'ND': 1900.0, 'NE': 2600.0, 'NH': 1000.0, 'NJ': 250.0, 'NM': 5700.0, 'NV': 5500.0, 'NY': 1000.0, 'OH': 850.0, 'OK': 1300.0, 'OR': 3300.0, 'PA': 1100.0, 'PR': None, 'PW': None, 'RI': 200.0, 'SC': 350.0, 'SD': 2200.0, 'TN': 900.0, 'TX': 1700.0, 'UT': 6100.0, 'VA': 950.0, 'VI': None, 'VT': 1000.0, 'WA': 1700.0, 'WI': 1050.0, 'WV': 1500.0, 'WY': 6700.0}

答案 1 :(得分:2)

mapping[key.upper()]不起作用,因为邮政是一张名字缩写的地图,而不是相反的地图。如果你想要替换值而不是键,这会更容易:

def reValueDict(keydict, valuedict):
    newDict = {}
    for key, value in keydict.iteritems():
        newDict[key] = valuedict.get(value.title())
    return newDict

print reValueDict(postal, elevation)

请注意,我必须将.upper()替换为.title()才能执行逆映射

或者作为一个单行:

print {k: elevation.get(v.title()) for k, v in postal.items()}

答案 2 :(得分:2)

这对你来说很好,只有一行不同。您应该只交换映射字典的键和值。

def rekeyDict(dct,mapping):
    newDict = {}
    # below is different line
    mapping = {v:k for k, v in mapping.items()}
    for key in dct:
        try:
            newDict[mapping[key.upper()]] = dct[key]
        except Exception, error:
            print "failed",error
            pass
    return newDict

elevation = rekeyDict(elevation,postal)
print elevation

答案 3 :(得分:0)

我认为如果您更改字典以便将完整的州名称映射到短字典,您的任务会更容易。您还可以使用字典get方法,以避免每次没有状态键时获取KeyErrors。

def reKey(elevation, postal):
    newDict = {}

    # creating new postal dict here
    # you will have something like {"SOUTH CAROLINA": "SC",..}
    newPostal = dict(zip(postal.values(),postal.keys()))
    for key in elevation:
        value = elevation[key]
        # dict.get allows you to avoid try except block
        # if there is no key it returns None
        # also you now have state full names as keys in newPostal
        # so you can just capitalize keys to elevate to get keys to newPostal
        newKey = newPostal.get(key.upper(),None)
        if newKey:
            newDict[newKey] = value
    return newDict

print reKey(elevation, postal)
相关问题