用python替换列表中的字符串

问题描述:

试图将名为'number'的所有元素替换为数据列表中的'numbr',但没有使其工作。用python替换列表中的字符串

编辑:所以每个关键号码应重新命名为numbr。价值观保持原样。

我在做什么错?

谢谢你的帮助!

data = [{'address': { 
        'city': 'city A', 
        'company_name': 'company A'}, 
     'amount': 998, 
     'items': [{'description': 'desc A1','number': 'number A1'}], 
     'number': 'number of A', 
     'service_date': { 
         'type': 'DEFAULT', 
         'date': '2015-11-18'}, 
     'vat_option': 123}, 
     {'address': { 
        'city': 'city B', 
        'company_name': 'company B'}, 
     'amount': 222, 
     'items': [{'description': 'desc B1','number': 'number B1'}, 
       {'description': 'desc B2','number': 'number B2'}], 
     'number': 'number of B', 
     'service_date': { 
        'type': 'DEFAULT', 
        'date': '2015-11-18'}, 
     'vat_option': 456} 
     ] 

def replace(l, X, Y): 
    for i,v in enumerate(l): 
     if v == X: 
     l.pop(i) 
     l.insert(i, Y) 

replace(data, 'number', 'numbr') 

print data 
+1

它应该只重命名键?发布预期结果 – RomanPerekhrest

+0

这就是结果 - 如你所见,没有变化: [{'vat_option':123,'items':[{'description':'desc A1','number':'number A1 '']],'number':'A的数量','amount':998,'address':{'city':'city A','company_name':'company A'},'service_date':{ date':'2015-11-18','type':'DEFAULT'}},{'vat_option':456,'items':[{'description':'desc B1','number':'number B1 '',{'description':'desc B2','number':'number B2'}],'number':'B的数量','amount':222,'address':{'city':'城市B','company_name':'公司B'},'service_date':{'date':'2015-11-18','type':'DEFAULT'}}] – thowi

+0

我要求**预计**结果,不是实际的 – RomanPerekhrest

下面是一个递归替换实现,在遇到在s对象,通过列表,集合,元组类型的字典递归(键和值)的任意字符串由p2替换p1

def nested_replace(s, p1, p2): 
    if isinstance(s, basestring): # Python2 
    # if isinstance(s, (str, bytes)): # Python3 
    return s.replace(p1, p2) 
    if isinstance(s, (list, tuple, set)): 
    return type(s)(nested_replace(x, p1, p2) for x in s) 
    if isinstance(s, dict): 
    return {nested_replace(k, p1, p2): nested_replace(v, p1, p2) for k, v in s.items()} 
    return s 

>>> from pprint import pprint 
>>> pprint(nested_replace(data, 'number', 'numbr')) 
[{'address': {'city': 'city A', 'company_name': 'company A'}, 
    'amount': 998, 
    'items': [{'description': 'desc A1', 'numbr': 'numbr A1'}], 
    'numbr': 'numbr of A', 
    'service_date': {'date': '2015-11-18', 'type': 'DEFAULT'}, 
    'vat_option': 123}, 
{'address': {'city': 'city B', 'company_name': 'company B'}, 
    'amount': 222, 
    'items': [{'description': 'desc B1', 'numbr': 'numbr B1'}, 
      {'description': 'desc B2', 'numbr': 'numbr B2'}], 
    'numbr': 'numbr of B', 
    'service_date': {'date': '2015-11-18', 'type': 'DEFAULT'}, 
    'vat_option': 456}] 
+0

谢谢!这是一个好的开始,因为它工作正常!真棒:) 有没有机会只更换钥匙?当前结果为:'numbr':'B'的numbr, 最好是这样:'numbr':'number of B', – thowi

+0

当然,删除处理列表和内容的块。在dict块中,用一个简单的'v'替换'nested_replace(v,p1,p2)'。你会失去嵌套的字母键,虽然... – schwobaseggl

+0

嘿,对不起再次打扰你 - 你可以看看这里吗?我想我错了,因为替换不工作:( def nested_replace(s,p1,p2): 如果isinstance(s,basestring):#Python2 return s.replace(p1,p2) #if isinstance (s,(列表,元组,集合)): #返回类型(nested_replace(x,p1,p2)对于x中的s) 如果isinstance(s,dict): return {nested_replace(k,p1 ,p2):v代表k,v代表s.items()} return s – thowi

eval函数是反模式,但我认为EVAL这里是最好的解决方案

data1 = eval(repr(data).replace('number', 'numbr')) 
+0

嘿,谢谢!这是一个聪明的小解决方案:D但是我确实希望只替换密钥,价值可以保持原样 – thowi

如果你想重新把这两个键和值这将工作。

from json import dumps, loads 

    data = [{'address': { 
        'city': 'city A', 
        'company_name': 'company A'}, 
     'amount': 998, 
     'items': [{'description': 'desc A1','number': 'number A1'}], 
     'number': 'number of A', 
     'service_date': { 
         'type': 'DEFAULT', 
         'date': '2015-11-18'}, 
     'vat_option': 123}, 
     {'address': { 
        'city': 'city B', 
        'company_name': 'company B'}, 
     'amount': 222, 
     'items': [{'description': 'desc B1','number': 'number B1'}, 
       {'description': 'desc B2','number': 'number B2'}], 
     'number': 'number of B', 
     'service_date': { 
        'type': 'DEFAULT', 
        'date': '2015-11-18'}, 
     'vat_option': 456} 
     ] 

data_string = dumps(data) 
data = loads(data_string.replace('number', 'numbr') 
+0

嘿,谢谢!这是一个聪明,小巧的解决方案:D但我确实只想更换钥匙,价值可以保持原样。 – thowi