2017-10-13 49 views
0

試圖將名爲'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

回答

1

下面是一個遞歸替換實現,在遇到在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

0

eval函數是反模式,但我認爲EVAL這裏是最好的解決方案

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

嘿,謝謝!這是一個聰明的小解決方案:D但是我確實希望只替換密鑰,價值可以保持原樣 – thowi

0

如果你想重新把這兩個鍵和值這將工作。

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