簡體   English   中英

在Python中有效地創建(播種)大型詞典

[英]Creating (seeding) large dictionaries efficiently in Python

我有一個很長的(500K +行)兩列電子表格,如下所示:

Name    Code
1234    A
1234    B
1456    C
4556    A
4556    B
4556    C
...

因此,有一個元素(帶有名稱)可以有許多代碼。 但是,每個代碼不是一行,而是希望列出每個元素發生的所有代碼。 我想要的是這樣的字典:

{"1234":["A","B"],"1456":["C"],"4556":["A","B","C"] ...]}

我試過的是這個(我不包括文件讀取語法)。


    codelist = {}
    for row in rows:
        name,code = well.split()
        if name in codelist.keys():
            codelist[name].append(code)
        else:
            codelist[name] = [code]

這會產生正確的輸出,但進度變得非常慢。 所以我嘗試用鍵啟動我的字典:

allnames = [.... list of all the names ...]
codelist = dict.fromkeys(allnames)

for row in rows:

    name,code = well.split()
    if codelist[name]:
        codelist[name].append(code)
    else:
        codelist[name] = [code]

這要快得多,我的問題是為什么? 每次程序是否仍然必須搜索dict中的所有鍵? 還有另一種方法來加速不包括遍歷樹的字典搜索嗎?

有趣的是我在使用相同的條件檢查時得到的錯誤(如果在codelist.keys():)中引用我的字典之后的名字。

Traceback (most recent call last):
  File .... 
    codelist[name].append(code)
AttributeError: 'NoneType' object has no attribute 'append'

現在,有一個鍵但沒有要附加的列表。 所以我使用的代碼codelist[name]也是<NoneType> ,似乎可行。 mydict["primed key"]<NoneType>時,這是什么意思? enter code here

前一個較慢,因為.keys()必須首先在內存中創建所有鍵的列表,然后in運算符對其執行搜索。 因此,它是對文本文件中每一行的O(N)搜索,因此它很慢。

另一方面key in dict搜索中的簡單key in dict需要O(1)時間。

dict.fromkeys(allnames)

dict.fromkeys指定的默認值為None ,因此您無法在其上使用append

>>> d = dict.fromkeys('abc')
>>> d
{'a': None, 'c': None, 'b': None}

一個更好的解決方案是在這里使用collections.defaultdict ,如果不是一個選項,那么使用普通的dict與簡單的if-else檢查或dict.setdefault


在Python3 .keys()返回一個View對象,因此時間復雜度可能不同。 但是,它仍然會比key in dict搜索中的普通key in dict略慢一些。

您可能希望查看defaultdict容器以避免檢查

from collections import defaultdict

allnames [.... list of all the names ...]
codelist = defaultdict(list)

for row in rows:

    name,code = well.split()
    codelist[name].append(code)

暫無
暫無

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

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