Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据字符串的结尾用数字替换列表中的字符串?_Python_Regex_Dictionary_Replace - Fatal编程技术网

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(我的问题意味着什么),这很好。所以我投了赞成票,可能会接受,这取决于其他答案的质量。