简体   繁体   English

用python替换列表中的字符串

[英]Replace string in list with python

trying to replace all elements named 'number' to 'numbr' in the data list but doesn't get it working. 尝试将数据列表中所有名为“ number”的元素替换为“ numbr”,但无法正常工作。

Edit: So each key number should be renamed to numbr. 编辑:因此每个键号应重命名为numbr。 Values stay as they are. 价值保持不变。

What am I doing wrong? 我究竟做错了什么?

Thank you for your help! 谢谢您的帮助!

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

The following is a recursive replace implementation that replaces p1 by p2 in any string it encounters in the s object, recursing through lists, sets, tuples, dicts (both keys and values): 下面是一个递归取代,取代实施p1通过p2在它遇到的任何字符串s对象,通过列表,集合,元组类型的字典递归(键和值):

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

评估功能是反模式,但我认为评估是最好的解决方案

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

If you are trying to replace both keys and values this will work. 如果您尝试同时替换键和值,则将起作用。

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')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM