Python 如何根据字符串的结尾用数字替换列表中的字符串?
假设我有一个这样的列表Python 如何根据字符串的结尾用数字替换列表中的字符串?,python,regex,dictionary,replace,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():
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
或其他更有效的方法来实现这一点呢?如果所有字典键总是以\u
(下划线)开头,您可以使用str.rsplit
和列表理解-
for i, e in enumerate(myList):
key = e[e.index("_"):]
if key not in myDict: continue
myList[i] = myDict[key]
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 = ['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]
对于一般版本(基本上是使用
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('_' + elem.rsplit('_',1)[1],elem) for elem in myList]
>>> myList
[0.1, 0.5, 0.1, 0.7, 0.1]
>>> 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循环(尽管它可能会慢一点)。如果所有字典键总是以
\u
(下划线)开头,您可以使用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 = ['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]
对于一般版本(基本上是使用
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('_' + elem.rsplit('_',1)[1],elem) for elem in myList]
>>> myList
[0.1, 0.5, 0.1, 0.7, 0.1]
>>> 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循环(尽管它可能稍微慢一点)
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]
根据实际数据的外观,可以使用以下选项:
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个字符吗?@AnandSKumar:不,结尾可以有不同的长度。你总是只排除第一个字符吗?@Cleb它总是以
\uuu
开头吗?@inspectorG4dget:不,你也可以将“WE\u someending”作为字符串。它总是最后3个字符吗?@AnandSKumar:不,结尾可以有不同的长度。你总是只排除第一个字符吗?@Cleb它是否总是以\uu
开头?@inspectorG4dget:不,你也可以将“WE\u someending”作为字符串。谢谢,这样很好。所以我投了赞成票,可能会接受,这取决于其他答案的质量。谢谢,这很好。所以我投了赞成票,可能会接受,这取决于其他答案的质量。谢谢,这很好。所以我投了赞成票,可能会接受,这取决于其他答案的质量。谢谢,这很好。因此,我投票表决,并可能会接受它,这取决于其他答案的质量。谢谢,如果我的钥匙总是长度为3(我的问题意味着什么),这很好。所以我会投票赞成,并可能会接受它,这取决于其他答案的质量。@Cleb如果键总是长度3,map不是一个坏选择,因为它比列表理解快。谢谢,如果我的键总是长度3(我的问题意味着什么)那就可以了。因此,我会根据其他答案的质量进行投票,并可能接受它。@Cleb如果键的长度始终为3,则map是一个不错的选择,因为它比列表理解更快。谢谢,如果我的键的长度始终为3(我的问题所指),这很好。因此,我投票表决,并可能会接受它,这取决于其他答案的质量。谢谢,如果我的钥匙总是长度为3(我的问题意味着什么),这很好。所以我投了赞成票,可能会接受,这取决于其他答案的质量。