如何在python中创建对象数组



我正在python中创建一个字典。当我循环遍历对象时,我得到了存储在字典中的相同对象。我哪里做错了?

我尝试了dict(),但我正在避开dict()

我尝试过的代码在这里:

image_dict = {}
#query for getting objects
images = Image_history.objects.all()
for image in images:
image_history = dict({
"type": image.image_type,
"timestamp": image.last_updated_timestamp,
})
image_dict.append(image_history)

我的问题是当我使用以下方法在python中创建字典时:

image_dict = {}
image_list = {}
# list of image_details
image_list["image_details"] = [] 
#query for getting objects
images = Image_history.objects.all() 
#looping through object and storing in dictionary
for image in images:
image_dict['type']= image.image_type
image_dict['timestamp']= image.last_updated_timestamp
#appending all those objects in loop to image_list
image_list["image_details"].append(image_dict)

我希望输出是不同对象的列表。但是,我得到了相同重复对象的列表。预期输出:

{
"image_detail":[
{
"type": "png",
"timestamp": "1-12-18"
},
{
"type": "jpeg",
"timestamp": "1-1-19"
}
]
}

我得到的实际输出:

{
"image_detail":[
{
"type": "jpeg",
"timestamp": "1-1-19"
},{
"type": "jpeg",
"timestamp": "1-1-19"
}
]
}

将代码编辑为:

image_list = {}
# list of image_details
image_list["image_details"] = [] 
#query for getting objects
images = Image_history.objects.all() 
#looping through object and storing in dictionary
for image in images:
image_dict = {}
image_dict['type']= image.image_type
image_dict['timestamp']= image.last_updated_timestamp
#appending all those objects in loop to image_list
image_list["image_details"].append(image_dict)

您正在编辑同一个dictionary对象,只需在每次迭代中创建一个新对象即可。Dictionary(使用dict{}创建(是python中的可变对象,我建议您阅读更多关于python中可变性的内容。我建议使用更紧凑的方式来构建列表,使用列表理解:

image_list["image_details"] = [
{
'type': image.image_type, 
'timestamp': image.last_updated_timestamp
} for image in images
]

注意:您可以在python中创建不可变的字典,但这偏离了主题。

您正在更改同一个image_dict对象,从而修改对该对象的现有引用(即以前的字典值(。

为什么要避免构建新的dict?这是创建单独词典的唯一方法。

或者,您可以将image_dict = {}移动到for循环中:

...
for image in images:
image_dict = {}
image_dict['type']= image.image_type
...

您需要使用image_historydict的副本,否则,您只是添加了同一dict的多个引用。如果不使用image_history.copy(),您会发现image_dict中的每个元素都具有for循环中最后一个图像相同的值。

请尝试以下操作。我用过dict.update()。我还使用了从images的枚举中导出的索引。这种方法的另一个好处是,您可以很容易地将其加载为数据帧来查看数据。

image_dict = dict()
#query for getting objects
images = Image_history.objects.all()
for i, image in enumerate(images):
image_history = {
"type": image.image_type,
"timestamp": image.last_updated_timestamp,
}
image_dict.update({i: image_history.copy()})
# Optionally visualize the data in a dataframe
import pandas as pd
df = pd.DataFrame(image_dict).T
df.head()

听写理解

使用dict理解的简明代码版本。

# dict of image_history dicts
image_dict = dict((i, {"type": image.image_type, 
"timestamp": image.last_updated_timestamp, 
}) for i, image in enumerate(images))

列表理解

使用列表理解的简明代码版本。

# list of image_history dicts
image_list = [{"type": image.image_type, 
"timestamp": image.last_updated_timestamp, 
}) for image in images)

最新更新