繁体   English   中英

如何根据数字的结尾将列表中的字符串替换为数字?

[英]How to replace strings in a list by numbers based on their endings?

假设我有一个这样的列表

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或其他更有效的方法来做到这一点?

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

如果所有字典键始终以_ (下划线)开头,则可以使用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循环(即使它可能慢一些)以提高可读性。

根据实际数据的外观,可以使用以下内容:

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]
# 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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM