【问题标题】:How to replace strings in a list by numbers based on their endings?如何根据结尾用数字替换列表中的字符串?
【发布时间】:2016-01-15 11:18:34
【问题描述】:

假设我有一个这样的列表

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 或其他更有效的方法?

【问题讨论】:

  • 总是最后三个字符吗?
  • @AnandSKumar:不,结尾可以有不同的长度。
  • 你总是只排除第一个字符吗?
  • @Cleb 它总是以_ 开头吗?
  • @inspectorG4dget:不,您也可以将 'WE_someending' 作为字符串。

标签: python regex dictionary replace


【解决方案1】:
for i, e in enumerate(myList):
    key = e[e.index("_"):]
    if key not in myDict: continue
    myList[i] = myDict[key]

【讨论】:

  • 谢谢,效果很好。所以我赞成它,并且可能会根据其他答案的质量接受它。
【解决方案2】:

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

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(我的问题所暗示的),那效果很好。所以我赞成它,并且可能会根据其他答案的质量接受它。
【解决方案3】:

如果所有字典键始终以 _(下划线)开头,您可以使用 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 循环(尽管它可能会慢一点)。

【讨论】:

  • 谢谢,效果很好。所以我赞成它,并且可能会根据其他答案的质量接受它。
【解决方案4】:
# 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]

【讨论】:

  • 谢谢,如果我的密钥总是长度为 3(我的问题所暗示的),那效果很好。所以我赞成它,并且可能会根据其他答案的质量接受它。
  • @Cleb 如果键的长度始终为 3,则 map 是一个不错的选择,因为它比列表推导更快。
猜你喜欢
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2019-03-30
  • 2019-09-29
  • 1970-01-01
  • 2023-01-30
相关资源
最近更新 更多