将列表值与字典中的项目进行比较

时间:2018-08-01 19:03:29

标签: python python-2.7 list dictionary list-comprehension

假设我有一个所有状态缩写的字典作为键,长名称作为值:

statesDict = {'AK': 'Alaska', 'AL': 'Alabama', 'AR': 'Arkansas',...}

我还有一个预选状态缩写的列表:

statesAbbrv = ['AL', 'CA', 'CO', 'DE']

基于cleanStates列表中的项目,我想仅选择 ,作为stateNames词典中状态缩写键的值(长名称)并将其放置在新列表中; stateNames = [] 因此,比较结果将如下所示:

stateNames = ['Alabama', 'California', 'Colorado', 'Deleware']

我在想以下内容,但没有用。我在这里做什么错了?

stateNames = []
for i in statesAbbrv:
    for k, v in statesDict:
        if stateDict[k] == stateAbbrv[i]:
            stateNames.append(stateDict(k))
print stateNames

7 个答案:

答案 0 :(得分:4)

功能上 1 ,您可以将map 2 dict.get一起使用:

stateNames = list(map(statesDict.get, statesAbbrv))

如果找不到匹配的缩写,则将给出None。较严格的版本将产生KeyError

stateNames = list(map(statesDict.__getitem__, statesAbbrv))

后者类似于列表理解,因为[]是访问__getitem__的语法:

stateNames = [statesDict[i] for i in statesAbbrv]

如果您希望在找不到密钥的情况下提供后备选项,请对dict.get使用列表推导:

stateNames = [statesDict.get(i, 'Fallback State') for i in statesAbbrv]

1 函数式编程是一种将计算视为数学函数评估的编程样式。另请参见Functional programming vs Object Oriented programming

2 在Python 2.x中,由于list返回了map,因此不需要显式list转换。在Python 3中,map返回一个可迭代对象,需要通过list来用尽。

答案 1 :(得分:3)

这是列表理解的典型工作:

stateNames = [statesDict.get(state, state) for state in statesAbbrv]
print(stateNames)
#['Alabama', 'CA', 'CO', 'DE']

请注意,如果由于某种原因而没有在字典中使用状态缩写,则它将用作状态名称本身。

答案 2 :(得分:2)

stateNames = [stateDict[k] for k in statesAbbrv if k in stateDict]

使用list comprehensions

答案 3 :(得分:2)

遍历列表statesAbbrv并在statesDict中查找值

statesNames = [statesDict[n] for n in statesAbbrv]

答案 4 :(得分:0)

stateNames = []
for i statesAbbrv:
    for k, v in statesDict.iteritems():
        if stateDict[k] == stateAbbrv[i]:
            stateNames.append(stateDict(k))
print stateNames

您需要添加iteritems()才能使字典在python 2.7上可迭代。

答案 5 :(得分:0)

您的问题中存在严重的打字错误。好的,这就是答案(只是在消除了您自己的代码中的错误之后):

statesDict = {'AK': 'Alaska', 'AL': 'Alabama', 'AR': 'Arkansas'}
statesAbbrv = ['AL', 'AK']

stateNames = []
for i in statesAbbrv:
    for k in statesDict.keys():
        if k == i:
            stateNames.append(statesDict[k])
print (stateNames)

答案 6 :(得分:0)

stateNames = [statesDict.get(i) for i in statesAbbrv]