删除字典中某个范围内的键/值对



我使用Python(使用3.8(已经有一段时间了,我一直在尝试组合一个快速而肮脏的工具来读取文本文件,删除特定范围内的键/值对,然后从中创建一个新的JSON文件。我主要不确定如何访问字典中选定范围的键/vals的索引,而不是以我可以修改任何内容的方式浏览整个内容。这就是我要说的:

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)
# 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对象,并且不能知道范围的长度是否为2(如果长度为2,则只有您可以解压缩(。

我认为,你的意图并不明确。你能写更多的细节吗?例如,像输入和输出示例

在读取json文件时,您可能需要考虑使用OrderedDict()。通过这种方式,您可以根据您的标准范围检查密钥的索引:

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)

普通字典无法保持你的词条的顺序。虽然我不完全确定在OrderedDictionaries的情况下是否需要reversed(),但最好向后工作,以确保在删除索引时不会更改索引。或者,你可以做:

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)

最新更新