Удалить повторяющиеся значения в разных Python Json Lists - PullRequest
1 голос
/ 05 ноября 2019

Я знаю, что есть много вопросов о дубликатах, но я не могу найти подходящее для меня решение.

У меня есть такая структура json:

    {
    "test": [
        {
            "name2": [
                "Tik",
                "eev",
                "asdv",
                "asdfa",
                "sadf",
                "Nick"
            ]
        },
        {
            "name2": [
                "Tik",
                "eev",
                "123",
                "r45",
                "676",
                "121"
            ]
        }
    ]
}

Iхочу сохранить первое значение и удалить все остальные дубликаты.

Ожидаемый результат

    {
    "test": [
        {
            "name2": [
                "Tik",
                "eev",
                "asdv",
                "asdfa",
                "sadf",
                "Nick"
            ]
        },
        {
            "name2": [
                "123",
                "r45",
                "676",
                "121"
            ]
        }
    ]
  }

Я пытался использовать tmp для проверки на наличие дубликатов, но это нене похоже на работу. Также я не могу найти способ сделать это снова JSON.

import json
with open('myjson') as access_json:
    read_data = json.load(access_json)

tmp = []
tmp2 = []
def get_synonyms():
    ingredients_access = read_data['test']
    for x in ingredients_access:
        for j in x['name2']:
            tmp.append(j)
            if j in tmp:
                tmp2.append(j)




get_synonyms()
print(len(tmp))
print(len(tmp2))

Ответы [ 3 ]

2 голосов
/ 05 ноября 2019

Вы можете использовать рекурсию:

def filter_d(d):
  seen = set()
  def inner(_d):
     if isinstance(_d, dict):
        return {a:inner(b) if isinstance(b, (dict, list)) else b for a, b in _d.items()}
     _r = []
     for i in _d:
       if isinstance(i, (dict, list)):
          _r.append(inner(i))
       elif i not in seen:
          _r.append(i)
          seen.add(i)
     return _r
  return inner(d)

import json
print(json.dumps(filter_d(data), indent=4))

Вывод:

{
  "test": [
    {
        "name2": [
            "Tik",
            "eev",
            "asdv",
            "asdfa",
            "sadf",
            "Nick"
        ]
    },
    {
        "name2": [
            "123",
            "r45",
            "676",
            "121"
        ]
     }
  ]
}
1 голос
/ 05 ноября 2019

Вот небольшой хакерский ответ:

d = {'test': [{'name2': ['Tik', 'eev', 'asdv', 'asdfa', 'sadf', 'Nick']},
              {'name2': ['Tik', 'eev', '123', 'r45', '676', '121']}]}
s = set()
for l in d['test']:
    l['name2'] = [(v, s.add(v))[0] for v in l['name2'] if v not in s]

Вывод:

{'test': [{'name2': ['Tik', 'eev', 'asdv', 'asdfa', 'sadf', 'Nick']},
          {'name2': ['123', 'r45', '676', '121']}]}

Здесь используется set для отслеживания уникальных значений и добавления уникальных значений к set, в то время каквозврат значения обратно в список.

1 голос
/ 05 ноября 2019

Сначала вы добавляете все к tmp, а затем к tmp2, потому что каждое значение было добавлено к tmp раньше.

Я немного изменил функцию, чтобы она работала для вашего конкретного примера теста:

def get_synonyms():
    test_list = []
    ingredients_access = read_data['test']
    used_values =[]
    for x in ingredients_access:
        inner_tmp = []
        for j in x['name2']:
            if j not in used_values:
                inner_tmp.append(j)
                used_values.append(j)
        test_list.append({'name2':inner_tmp})
    return {'test': test_list}


result = get_synonyms()
print(result)

Выход:

{'test': [{'name2': ['Tik', 'eev', 'asdv', 'asdfa', 'sadf', 'Nick']}, {'name2': ['123', 'r45', '676', '121']}]}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...