簡體   English   中英

如何在Python的嵌套defaultdict結構中有效地遍歷列表?

[英]How to efficiently iterate over a list in nested defaultdict structure in Python?

我正在處理大量網址(根據時間表),並將它們歸類為嵌套的defaultdict結構,如下所示:

我的類別是:

  • 選項:3種可能性
  • 季度:4種可能性
  • 周:52種可能性

幾周的值應該是一個列表。

我的密碼

def setup_urls(option):

    urls = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))

    for quarter in range(1, 5):
        for week in range( 1, 53):
        // logic of computing url goes here
        links[option][quarter][week].append(url)

    return urls

輸出量

A list with multiple defaultdict in it.

[defaultdict( < function setup_urls. < locals > . < lambda > at 0x7fd30ed2d488 > , {
    'option': defaultdict( < function setup_urls. < locals > . < lambda > . < locals > . < lambda > at 0x7fd3122a2158 > , {
        1: defaultdict( < class 'list' > , {
            45: [ url1, url2, url3, url4, url5 ]
        }),
    })
})]

由於高效地處理大型數據集,我不想使用標准詞典。 我必須存儲大約5000-10000個網址。 將來可能會達到100000。

通過我自己的一些研究,可以使用defaultdict來提高性能,但是使用lambda的用法似乎並不是Python風格。 不知道是否有更好的解決方案,但這不是我的主要問題。

我目前正在使用此代碼訪問所有url,但是感覺像是很臟的代碼,特別是根本不是Pythonic。

    for dict in result:
        for quarter in dict.values():
            for week in quarter.values():
                for url in week.values():
                    print(url)

我想知道哪種更好的方法是訪問這些URL以利用map函數? (這是存儲網址的最佳方法嗎?)

您可以通過遞歸函數為任意級別的嵌套字典構建邏輯。 以下是使用itertools.chain的示例。

from collections import defaultdict
from itertools import chain

def get_values(d, res=[]):
    for k, v in d.items():
        if isinstance(v, dict):
            get_values(v, res=res)
        else:
            res.append(v)
    return list(chain.from_iterable(res))

d = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))

d[1][2][3].append(343)
d[1][2][3].append(1245)
d[1][2][4].append(563)
d[1][2][4].append(763)

res = list(get_values(d))
# [343, 1245, 563, 763]

暫無
暫無

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

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