Python 字典在处理过程中和处理后是不同的

问题描述 投票:0回答:1

我想要做的是将一个字典列表(如果一个字段具有用逗号分隔的 n 个值)拆分为一个包含 n 个字典的列表,其中所有其他字段都相同,但具有多个值的字段现在具有唯一值。

这是输出:

 before
[{'id': 1, 'time': '1,2,3'}, {'id': 2, 'time': '4,5'}, {'id': 3, 'time': '6'}, {'id': 4, 'time': '7,8,9,10'}]
during
['1', '2', '3']
{'id': 1, 'time': '1'}
{'id': 1, 'time': '2'}
{'id': 1, 'time': '3'}
['4', '5']
{'id': 2, 'time': '4'}
{'id': 2, 'time': '5'}
['7', '8', '9', '10']
{'id': 4, 'time': '7'}
{'id': 4, 'time': '8'}
{'id': 4, 'time': '9'}
{'id': 4, 'time': '10'}
after
{'id': 1, 'time': '3'}
{'id': 2, 'time': '5'}
{'id': 3, 'time': '6'}
{'id': 4, 'time': '10'}
{'id': 1, 'time': '3'}
{'id': 1, 'time': '3'}
{'id': 2, 'time': '5'}
{'id': 4, 'time': '10'}
{'id': 4, 'time': '10'}
{'id': 4, 'time': '10'}

为什么会出现这种情况? 如何让代码变得更好? 预先感谢。

这是我的代码

meta = [{"id":1,"time":"1,2,3"},{"id":2,"time":"4,5"},{"id":3,"time":"6"},{"id":4,"time":"7,8,9,10"}]
print("before")
print(meta)
meta_copy = meta.copy()
placeholder = meta.copy()

print("during")
for i in range(len(meta)):
    if "," in meta[i]["time"]:
        sub = meta[i]["time"].split(",")
        print(sub)
        for j in range(len(sub)):
            if j == 0:

                meta_copy[i]["time"] = sub[0]
                print(meta_copy[i])
            else:
                placeholder[i]["time"]=sub[j]
                #print(placeholder[i]["time"])
                meta_copy.append(placeholder[i])
                print( meta_copy[-1])
print("after")
for l in range(len(meta_copy)):
    print(meta_copy[l])
python dictionary
1个回答
0
投票

在 Python 中,字典是可变的。当您执行

placeholder = meta.copy()
时,您正在创建一个副本。由于
placeholder
中的对象与
meta
中的对象相同,当您修改
placeholder[i]
时,您也在修改
meta_copy
中的相同字典。

您需要在修改之前创建一个深层副本。使用

deepcopy
中的
copy
模块:

import copy
meta = [{"id":1,"time":"1,2,3"},{"id":2,"time":"4,5"},{"id":3,"time":"6"},{"id":4,"time":"7,8,9,10"}]
print("before")
print(meta)
meta_copy = meta.copy()
print("during")
for i in range(len(meta)):
    if "," in meta[i]["time"]:
        sub = meta[i]["time"].split(",")
        print(sub)
        for j in range(len(sub)):
            if j == 0:
                meta_copy[i]["time"] = sub[0]
                print(meta_copy[i])
            else:
                placeholder = copy.deepcopy(meta_copy[i])
                placeholder["time"]=sub[j]
                meta_copy.append(placeholder)
                print(meta_copy[-1])
print("after")
for l in range (len(meta_copy)):
    print(meta_copy[l])
© www.soinside.com 2019 - 2024. All rights reserved.