假设我有一个所有状态缩写的字典作为键,长名称作为值:
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
答案 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]
答案 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]