如何根据列表中的数字替换列表中的字符串?

时间:2015-10-16 16:09:13

标签: python regex dictionary replace

假设我有一个这样的列表

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还是其他更有效的方法?

4 个答案:

答案 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]