[英]How to randomly replace a string in a list based on another list of strings
[英]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.