Учитывая строку внутри вложенного Json, как я могу изменить его идентификатор для конкретной строки? - PullRequest
0 голосов
/ 06 октября 2018

Я читаю Json, который представляет собой список из нескольких словарей, подобных этому:

a_list = [ {
    "ID": "20394820938",
    "data": [
      {
        "fruit": "tomato",
        "provider": "walmart",
        "availability": "True",
        "Type": false
      },
      {
        "fruit": " orange ",
        "Type": false
      },
      {
        "fruit": "watermelon",
        "provider": "destination",
        "availability": "cotsco",
        "Type": false
      },
      {
        "fruit": " the watermelon is new",
        "Type": false
      }
    ],
    "API": false,
    "count": 0
  },  
  {
    "ID": "203948lHBFNPO",
    "data": [
      {
        "fruit": "apple",
        "provider": "walmart",
        "availability": "True",
        "Type": false
      },
      {
        "fruit": " this is a tomato ",
        "Type": false
      },
      {
        "fruit": "lemon",
        "provider": "unknown",
        "availability": "cotsco",
        "Type": false
      },
      {
        "fruit": " orange ",
        "Type": false
      },
      {
        "fruit": "banana",
        "provider": "unknown",
        "availability": "unknown",
        "Type": false
      }
    ],
    "API": false,
  }
]

Как я могу прикрепить IM00N к значению идентификатора Json, если и только если в словаре есть строкаapple в одном из его подэлементов?Например:

a_list = [ {
    "ID": "20394820938",
    "data": [
      {
        "fruit": "tomato",
        "provider": "walmart",
        "availability": "True",
        "Type": false
      },
      {
        "fruit": "apple",
        "Type": false
      },
      {
        "fruit": "watermelon",
        "provider": "destination",
        "availability": "cotsco",
        "Type": false
      },
      {
        "fruit": " the watermelon is new",
        "Type": false
      }
    ],
    "API": false,
    "count": 0
  },  
  {
    "ID": "IM00N-203948lHBFNPO",
    "data": [
      {
        "fruit": "apple",
        "provider": "walmart",
        "availability": "True",
        "Type": false
      },
      {
        "fruit": " this is a tomato ",
        "Type": false
      },
      {
        "fruit": "lemon",
        "provider": "unknown",
        "availability": "cotsco",
        "Type": false
      },
      {
        "fruit": " orange ",
        "Type": false
      },
      {
        "fruit": "banana",
        "provider": "unknown",
        "availability": "unknown",
        "Type": false
      }
    ],
    "API": false,
  }
]

Я пытался построить регулярное выражение, но это было сложно, потому что в элементах каждого под-словаря внутри списка нет шаблона.Как правильно подходить к этому соответствию и замене?

1 Ответ

0 голосов
/ 06 октября 2018

Вы можете изменить данные с помощью цикла for:

for entry in a_list:
    if any('apple' in item['fruit'] for item in entry['data']):
        entry['ID'] = 'IM00N-' + entry['ID']

Если форма ваших данных меняется, так что некоторые записи не имеют клавиши fruit, вы можете поймать KeyErrorили используйте dict.get

for entry in a_list:
    if any('apple' in item.get('fruit', '') for item in entry.get('data', [])):
        entry['ID'] = 'IM00N-' + entry['ID']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...