用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
下面是一个递归替换实现,在遇到在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}]
谢谢!这是一个好的开始,因为它工作正常!真棒:) 有没有机会只更换钥匙?当前结果为:'numbr':'B'的numbr, 最好是这样:'numbr':'number of B', – thowi
当然,删除处理列表和内容的块。在dict块中,用一个简单的'v'替换'nested_replace(v,p1,p2)'。你会失去嵌套的字母键,虽然... – schwobaseggl
嘿,对不起再次打扰你 - 你可以看看这里吗?我想我错了,因为替换不工作:( 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'))
嘿,谢谢!这是一个聪明的小解决方案: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')
嘿,谢谢!这是一个聪明,小巧的解决方案:D但我确实只想更换钥匙,价值可以保持原样。 – thowi
它应该只重命名键?发布预期结果 – RomanPerekhrest
这就是结果 - 如你所见,没有变化: [{'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
我要求**预计**结果,不是实际的 – RomanPerekhrest