簡體   English   中英

如何在 python 中創建對象數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM