2015-10-16 44 views
1

假设我有这样如何用数字替换列表中的字符串根据其结尾?

myList = ['A_x1', 'B_x2', 'C_x1', 'D_x3', 'E_x1'] 

列表,并像这样

myDict = {'_x1': 0.1, '_x2': 0.5, '_x3': 0.7} 

字典现在我想通过关联到这个结局存储在myDict值来替换所有字符串myList串。当然,我可以做到这一点通过以下:

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

+1

是它总是在最后3个字符? –

+0

@AnandSKumar:不,结局可以有不同的长度。 – Cleb

+0

你总是只排除第一个字符吗? – inspectorG4dget

回答

1
for i, e in enumerate(myList): 
    key = e[e.index("_"):] 
    if key not in myDict: continue 
    myList[i] = myDict[key] 
+0

谢谢,这工作正常。所以我喜欢它,并可能接受它取决于其他答案的质量。 – Cleb

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] 

对于一般版本(基本上你使用完成的列表理解中的嵌套循环)。示例 -

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循环(尽管它可能有点慢)的可读性。

+0

谢谢,这工作正常。所以我喜欢它,并可能接受它取决于其他答案的质量。 – Cleb

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] 
+0

谢谢,如果我的钥匙总是长度为3(我的问题意味着什么),那很好。所以我喜欢它,并可能接受它取决于其他答案的质量。 – Cleb

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] 
+0

谢谢,如果我的钥匙总是长度为3(我的问题暗示),那很好。所以我喜欢它,并可能接受它取决于其他答案的质量。 – Cleb

+0

@Cleb如果密钥长度始终为3,则映射不是一个不好的选择,因为它比列表解析更快。 – LetzerWille

相关问题