簡體   English   中英

將列表項迭代到嵌套字典中的大多數pythonic方法

[英]Most pythonic way of iterating list items into a nested dict

我有一個問題,我想確定我的方法是否正確。 這里是想法:

我將創建一個名為zip_codes的主字典,其中每個郵政編碼(從列表中)是每個嵌套字典的名稱。 每個都有“成員”,“辦公室”,“每個辦公室的成員”的鍵。它看起來像這樣:

zips {
    90219: {
      "members": 120,
      "offices": 18,
      "membersperoffice": 28
    },
    90220: {
      "members": 423,
      "offices": 37,
      "membersperoffice": 16
    }
}

等等等等。

我想我需要構建嵌套的字典,然后根據條件處理多個列表,將結果值即時傳遞給相應的字典(即,基於列表中郵政編碼的數量)。

使用嵌套字典是執行此操作的最有效的方法嗎? 麻煩嗎? 有沒有更好的辦法?

有人可以給我一個關於如何將關鍵值從循環中推入嵌套字典的提示嗎? 我找不到能夠描述我要做什么的好資源(如果確實是最佳途徑)。

謝謝。

:edit:一個更具體的例子:

  1. 確定列表中有多少個郵政編碼實例稱為membersperzip
  2. 在名為zips的字典中找到與郵政編碼相同名稱的對應嵌套字典
  3. 將值傳遞給相應的鍵,稱為“成員”(或任何鍵)

:編輯2:

MadPhysicist請求我提供代碼示例(我什至不知道從哪里開始,也找不到示例。到目前為止,我所能做的就是:

area_dict = {}

area_dict = dict.fromkeys(all_areas, 0)  #make all of the zipscodes keys, add a zero in the first non-key index

dictkeys = list (area_dict.keys())

這使我成為了以一堆郵政編碼作為鍵的字典。 我發現沒有辦法遍歷列表並創建嵌套字典(尚未)。 因此,實際的問題。

請不要dog我,並執行通常的堆棧溢出操作。 這不是我要任何人做作業。 這僅僅是我要某人給我的提示。

:編輯3:

好。 這令人費解(我的錯)。 請允許我進一步說明:

因此,我有一個嵌套字典應該是什么樣子的示例。 他們將開始是空的,但我需要遍歷一個郵政編碼列表以創建所有嵌套的字典……在zip內。

這是我想用於在zip字典內部創建嵌套字典的列表的示例:

zips = [90272, 90049, 90401, 90402, 90403, 90404, 90291, 90292, 90290, 90094, 90066, 90025, 90064, 90073]

這就是我想要的樣子

zips {
    90272: {
      "members": ,
      "offices": ,
      "membersperoffice": 
    },
    90049: {
      "members": ,
      "offices": ,
      "membersperoffice": 
    }
}

....等等,等等(為列表中的每個郵政編碼創建一個對應的嵌套字典)

完成此操作后,我必須遍歷其他幾個郵政編碼列表……這些列表會吐出郵政編碼出現在給定列表中的次數,然后找到與該郵政編碼對應的字典,然后將該值附加到相關密鑰。

我想出第一部分,我可以自己解決第二部分。

再次感謝。 抱歉給您帶來任何混亂。

您可以執行以下操作:

all_areas = [90219, 90220]

zips = {zipcode: code_members(zipcode) for zipcode in all_areas}

def code_members(zipcode):
    if zipcode == 90219:
        return dict(members=120, offices=18, membersperoffice=28)
    return dict(members=423, offices=37, membersperoffice=16)

我想我需要構建嵌套的字典,然后根據條件處理多個列表,將結果值即時傳遞給相應的字典( 即,基於列表中郵政編碼的數量 )。

使用上述方法,如果zipcodeall_areas列表中多次出現,則生成的zip字典將僅包含zipcode一個實例。

使用嵌套字典是執行此操作的最有效的方法嗎? 麻煩嗎? 有沒有更好的辦法?

我可以建議創建一個簡單的對象來表示每個zipcode的值。 很簡單的東西:

使用數據類:

@dataclass.dataclass
class ZipProperties(object):
    members: int
    offices: int
    membersperoffice: int

使用命名元組:

ZipProperties = collections.namedtuple('ZipProperties', ['members', 'offices', 'membersperoffice'])

然后,您可以將code_members函數更改為此:

def code_members(zipcode):
    if zipcode == 90219:
        return ZipProperties(120, 18, 28)
    return ZipProperties(423, 37, 16)

解決您的具體示例:

  1. 確定列表中有多少個郵政編碼實例稱為membersperzip
  2. 在名為zips的字典中找到與郵政編碼相同名稱的對應嵌套字典
  3. 將值傳遞給相應的鍵,稱為“成員”(或任何鍵)
membersperzip: typings.List[Tuple[int, int]] = [(90219, 54)]

for zip, members in membersperzip:
    for zipcode, props in zips.items():
        if zipcode == zip:
            props.members = members

我建議您在有實際值時附加它,而不是用每個鍵的空值初始化字典。 您有鍵的列表,但我不明白為什么要把所有鍵都放在字典中而不首先放在值上。

zips = [90272, 90049, 90401, 90402, 90403, 90404, 90291, 90292, 90290, 90094, 90066, 90025, 90064, 90073]
zips_dict = {}
for a_zip in zips:
    if a_zip not in zips_dict:
        # Initialize proper value here for members etc.
        zips_dict[a_zip] = proper_value

如果您堅持使用每個鍵的空值來初始化dict ,則可以使用此方法,無論如何,它都會在python理解中迭代list

zips = [90272, 90049, 90401, 90402, 90403, 90404, 90291, 90292, 90290, 90094, 90066, 90025, 90064, 90073]
zips_dict = {
   x:{
       "members":None,
       "offices":None,
       "membersperoffice":None,
   } for x in zips
}

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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