[英]How to create array of objects in python
我正在 python 中創建字典。 當我循環通過 object 時,我將相同的對象存儲在字典中。 我在哪里做錯了?
我嘗試了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)
我希望 output 是不同對象的列表。 但是,我得到了相同重復對象的列表。 預期 output:
{
"image_detail":[
{
"type": "png",
"timestamp": "1-12-18"
},
{
"type": "jpeg",
"timestamp": "1-1-19"
}
]
}
實際 output 我得到:
{
"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)
您正在編輯同一個字典 object,您只需在每次迭代時創建一個新字典。 字典(使用dict
或{}
創建)是 python 中的可變對象,我建議您閱讀有關 python 中的可變性的更多信息。 我建議使用更緊湊的方式來構建您的列表,使用列表推導:
image_list["image_details"] = [
{
'type': image.image_type,
'timestamp': image.last_updated_timestamp
} for image in images
]
注意:您可以在 python 中創建不可變字典,但這離題了。
您正在改變相同的image_dict
object,這反過來又修改了對該 object 的現有引用(即以前的字典值)。
你為什么避免構建一個新的dict
? 這是創建單獨字典的唯一方法。
或者,您可以將image_dict = {}
移動到for
循環中:
...
for image in images:
image_dict = {}
image_dict['type']= image.image_type
...
您需要使用image_history
dict 的副本,否則,您只是添加了同一 dict 的多個引用。 在不使用image_history.copy()
的情況下,您會發現 image_dict 中的每個元素與for
循環中的最后一個圖像image_dict
具有相同的值。
試試下面的。 我用過dict.update()
。 我還使用從images
枚舉中得出的索引。 這種方法的另一個好處是您可以輕松地將其加載為 dataframe 以查看數據。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.