Удалить пары ключ / значение в словаре в определенном диапазоне - PullRequest
0 голосов
/ 01 мая 2020

Прошло много времени с тех пор, как я использовал Python (используя 3.8), и я пытался собрать быстрый и грязный инструмент для чтения из текстового файла, удаления пар ключ / значение в определенном диапазоне, и затем создайте новый JSON файл из него. В основном я не уверен, как получить доступ к индексам ключа / значений выбранного диапазона в словаре, а не к тому, чтобы пройти через все это так, чтобы я мог что-либо изменить. Вот к чему я пришел:

new_data = []
with open('edu01.txt') as json_file:
    the_data = json.load(json_file)

    for obj in the_data:
        new_obj = {}
        for key, val in obj.items():
            new_obj[key] = val

        # TypeError: cannot unpack non-iterable int object
        for cut_key, cut_val in range(2, len(new_obj.items()) - 8):
            new_obj.remove(cut_key, cut_val)

        new_data.append(new_obj)

Ответы [ 2 ]

0 голосов
/ 01 мая 2020
# TypeError: cannot unpack non-iterable int object
        for cut_key, cut_val in range(2, len(new_obj.items()) - 8):
            new_obj.remove(cut_key, cut_val)

В этой части вы не можете распаковать range(2, len(new_obj.items()) - 8), потому что, это range объект, а не dict объект и не может знать, что длина диапазона равна двум или нет (Если длина равна двум, только вы можете распаковать).

И, думаю, ваше намерение неясно. Не могли бы вы написать более подробно? Например, как пример ввода и вывода

0 голосов
/ 01 мая 2020

Вы можете рассмотреть возможность использования OrderedDict() при чтении из файла json. Таким образом, вы можете проверить индекс ключей по диапазону критериев:

the_data = json.load(open('edu01.json'), object_pairs_hook=OrderedDict)

for idx, key in enumerate(reversed(the_data.keys())):
    if idx in range(len(the_data.items()) - 2, 8, -1):
        the_data.pop(key)

Обычные словари не сохранят порядок ваших элементов. Хотя я не совсем уверен, что reversed() необходим в случае OrderedDictionaries, лучше работать в обратном направлении, чтобы не изменять индексы при их удалении. В качестве альтернативы вы можете сделать:

the_data = json.load(open('edu01.json'), object_pairs_hook=OrderedDict)
keys_to_remove = []

for idx, key in enumerate(reversed(the_data.keys())):
    if idx in range(len(the_data.items()) - 2, 8, -1):
        keys_to_remove.append(key)

for k in keys_to_remove:
    the_data.pop(k)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...