python 在数组中循环时,是否可以更改数组中的对象?

zbdgwd5y  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(234)

我正在尝试改变一个数组中对象的结构,我用for循环来循环这个数组。除非我把它追加到一个新数组中,否则这个对象似乎什么也没发生。
我只是忍不住想有更好的办法...
我用占位符数据替换了所有真实的的数据和命名,只是为了结构。
虽然本质上我只是想在original_array中重构obj,而不是附加到一个新的obj

rebuilt_array = []

    for obj in original_array:
        rebuilt_obj = {
            "inner_obj_1": {
                "item_1": obj["old_item_1"],
                "item_2": obj["old_item_2"],
                "item_3": obj["old_item_3"],
            },
            "another_item": obj["old_another_item"],
            "inner_obj_2": {
                "item_1": obj["old_item_1"],
                "item_2": obj["old_item_2"],
                "item_3": obj["old_item_3"],
            },
        }

        rebuilt_array.append(rebuilt_obj)
tkqqtvp1

tkqqtvp11#

当你执行for obj in original_array时,obj是一个局部变量,也是列表中原始对象的副本,所以修改它不会在列表中反映出来,这里有一个方法,你可以做同样的事情,而不用创建一个新的列表并就地更新列表-

original_array = [{"old_item_1": 1, "old_item_2": 2, "old_item_3": 3, "old_another_item": -1}]

for i, obj in enumerate(original_array):
    new_obj = {
        "inner_obj_1": {
            "item_1": obj["old_item_1"],
            "item_2": obj["old_item_2"],
            "item_3": obj["old_item_3"],
        },
        "another_item": obj["old_another_item"],
        "inner_obj_2": {
            "item_1": obj["old_item_1"],
            "item_2": obj["old_item_2"],
            "item_3": obj["old_item_3"],
        },
    }
    original_array[i] = new_obj

print(original_array)
    • 输出:**
[{'inner_obj_1': {'item_1': 1, 'item_2': 2, 'item_3': 3}, 'another_item': -1, 'inner_obj_2': {'item_1': 1, 'item_2': 2, 'item_3': 3}}]

您还可以进一步修改它,这样我们就不需要创建new_obj,并且您可以通过更新original_array[i] dict来直接更新旧对象,就像您使用普通dict一样。例如,original_array[i]['another_item'] = original_array[i].pop("old_another_item")会将原始对象中的old_another_item键重命名为another_item,但与上述方法相比,这可能会变得更脏。
下面是它的相应代码-

for i in range(len(original_array)):
    original_array[i] = {
        "inner_obj_1": {
            "item_1": original_array[i]["old_item_1"],
            "item_2": original_array[i]["old_item_2"],
            "item_3": original_array[i]["old_item_3"],
        },
        "another_item": original_array[i].pop("old_another_item"),
        "inner_obj_2": {
            "item_1": original_array[i].pop("old_item_1"),
            "item_2": original_array[i].pop("old_item_2"),
            "item_3": original_array[i].pop("old_item_3"),
        }
    }

注意使用pop()来重命名dict键,如果您还想在dict中保留原始键,那么可以跳过使用pop()

相关问题