簡體   English   中英

用python替換列表中的字符串

[英]Replace string in list with python

嘗試將數據列表中所有名為“ number”的元素替換為“ numbr”,但無法正常工作。

編輯:因此每個鍵號應重命名為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

下面是一個遞歸取代,取代實施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'))

如果您嘗試同時替換鍵和值,則將起作用。

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