假设我有一个这样的列表
myList = ['A_x1', 'B_x2', 'C_x1', 'D_x3', 'E_x1']
和这样的字典
myDict = {'_x1': 0.1, '_x2': 0.5, '_x3': 0.7}
现在我想将myList
中的所有字符串替换为与此字符串结尾相关联的myDict
中存储的值。我当然可以通过以下方式实现这一目标:
for ind, l in enumerate(myList):
for k in myDict.iterkeys():
if l.endswith(k):
myList[ind] = myDict[k]
给了我想要的输出:
[0.1, 0.5, 0.1, 0.7, 0.1].
但是如何使用例如map
还是其他更有效的方法?
答案 0 :(得分:1)
for i, e in enumerate(myList):
key = e[e.index("_"):]
if key not in myDict: continue
myList[i] = myDict[key]
答案 1 :(得分:1)
如果所有字典键始终以_
(下划线)开头,则可以使用str.rsplit
和列表理解 -
myList[:] = [myDict.get('_' + elem.rsplit('_',1)[1],elem) for elem in myList]
演示 -
>>> myList = ['A_x1', 'B_x2', 'C_x1', 'D_x3', 'E_x1']
>>> myDict = {'_x1': 0.1, '_x2': 0.5, '_x3': 0.7}
>>> myList[:] = [myDict.get('_' + elem.rsplit('_',1)[1],elem) for elem in myList]
>>> myList
[0.1, 0.5, 0.1, 0.7, 0.1]
对于通用版本(基本上是使用next()
完成的列表推导中的嵌套循环)。示例 -
myList[:] = [myDict.get(next((key for key in myDict if elem.endswith(key)),None),elem)
for elem in myList]
演示 -
>>> myList = ['A_x1', 'B_x2', 'C_x1', 'D_x3', 'E_x1']
>>> myDict = {'_x1': 0.1, '_x2': 0.5, '_x3': 0.7}
>>>
>>> myList[:] = [myDict.get(next((key for key in myDict if elem.endswith(key)),None),elem)
... for elem in myList]
>>>
>>> myList
[0.1, 0.5, 0.1, 0.7, 0.1]
但是为了便于阅读,我更喜欢嵌套的for循环(即使它可能有点慢)。
答案 2 :(得分:1)
根据您的实际数据的外观,可以使用以下内容:
myList = ['A_x1', 'B_x2', 'C_x1', 'D_x3', 'E_x1']
myDict = {'_x1': 0.1, '_x2': 0.5, '_x3': 0.7}
print [myDict[x[-3:]] for x in myList]
,并提供:
[0.1, 0.5, 0.1, 0.7, 0.1]
答案 3 :(得分:1)
# first map through lambda gets the endings.
# second map applies the endings as keys to myDict
print(list(map(myDict.get,map(lambda x: x[-3:],myList))))
[0.1, 0.5, 0.1, 0.7, 0.1]