用python替换列表中的字符串

时间:2017-10-13 16:30:11

标签: python string list replace

尝试替换名为' number'的所有元素到#num;'在数据列表中,但没有使它工作。

编辑:因此每个键号应重命名为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

3 个答案:

答案 0 :(得分:1)

以下是递归替换实现,它在p1对象中遇到的任何字符串中用p2替换s,通过列表,集合,元组,dicts(密钥和值):

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}]

答案 1 :(得分:0)

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

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

答案 2 :(得分: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')