【问题标题】:python list replace only if it is a exact match using list comprehension [duplicate]python列表仅在使用列表理解完全匹配时才替换[重复]
【发布时间】:2021-05-27 21:05:46
【问题描述】:

我有以下列表:-

list= ['order','orderNumber']

我想将order 括在双引号“订单”中,而不是订单号 我在列表理解中尝试了以下内容

if 'order' in list:
     list = [item.replace('order', '"' + 'order' + '"') for item in list]

但输出是:- orderNumber 中的订单也用双引号括起来,这是不需要的

['"order"', '"order"Number']

预期输出是:-

['"order"', 'orderNumber']

【问题讨论】:

  • 你能改一下list[0]吗?
  • 为什么需要双引号?
  • 它可以在列表中的任何位置
  • 您正在检查order 是否在list 中,然后在True 中修改所有项目。您还需要检查理解。

标签: python replace list-comprehension


【解决方案1】:

您应该使用== 运算符而不是in

lst = ['order','orderNumber']
lst = [f'"{elt}"' if elt == 'order' else elt for elt in lst]
print(lst)

另外,不要使用list 作为对象名称。


更新:对于不支持 fstrings 的低于 3.6 的 Python 版本,请使用串联运算符 +

lst = ['order','orderNumber']
lst = ['"{}"'.format(elt) if elt == 'order' else elt for elt in lst]
print(lst)

【讨论】:

  • thanks..works...f 代表替换..?
  • f 是 fstrings 的缩写,用于格式化字符串
  • 适用于 python3...但是对于 python 2.7 不支持 F 前缀...除了使用正则表达式之外还有其他选择
  • 添加了包含没有 fstrings 的竞争运算符 + 的代码。
  • @KrishnaChaurasia:我建议要么只使用'"order"'(因为它实际上是我们正在处理的一个字符串,我们不需要根据循环变量工作),或者如果你讨厌重复自己(不会怪你),'"{}"'.format(elt),对于一个可以回到 2.6 的解决方案(直接创建输出,类似于 f 字符串,而不是产生一个临时的中间字符串;str.format 是前身到 f 字符串,它是语言语法直接支持的更强大的 str.format 版本)。 Pre-2.6,'"%s"' % elt'"%s"' % (elt,)elt 可能是tuple)。
【解决方案2】:

您可以使用regular expressionre.sub

>>> import re
>>> lst = ['order', 'orderNumber']
>>> [re.sub('^order$', '"order"', item) for item in lst]
>>> ['"order"', 'orderNumber']

【讨论】:

    【解决方案3】:

    请您检查以下是否适合您

    lista = ['order','orderNumber']
    listb = []
    if 'order' in lista:
        for item in lista:
            if item == 'order':
                listb.append(item.replace('order', '"' + 'order' + '"'))
            else:
                listb.append(item)
    lista = listb
    

    【讨论】:

    • 1) 仅代码的答案通常不受欢迎,尤其是当他们对原始代码进行重大更改并且任何给定更改的相关性不清楚时。 2)这是非常复杂的事情(例如,当你知道,事实上,字符串只是'order',你仍然依赖str.replace来制作更新版本,而你可以只做listb.append('"order"')
    • 3) 使用 listcomp,创建一个新的 list 是不可避免的,但是当意图更新到位时,就像你(在某种程度上)在最后重新分配 lista 时所做的那样,你不需要建立一个新的listfor i, item in enumerate(lista): if item == 'order': lista[i] = '"order"' 将避免构建新的list 的需要,并将所有未更改的元素的工作保持在接近于零的水平。考虑到这一点,我检查了这个问题的重复项,你瞧,the accepted answer on the duplicate 这样做了。 :-)
    猜你喜欢
    • 2018-03-20
    • 2016-08-31
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2011-06-15
    • 2013-01-26
    • 1970-01-01
    相关资源
    最近更新 更多