2017-05-04 69 views
2

我需要在從一個生成器讀取輸入的同時創建兩個字典。我很關心dict和數據原則上只需要滾動一次的事實。我應該如何繼續?從一個迭代器創建兩個字典

# dummy data 
def data(): 
    yield 'a', 5 
    yield 'b', 8 
    yield 'c', 12 

# two iterations, bad. 
first = {k: v + 1 for k, v in data()} 
second = {k: 2 * v for k, v in data()} 

# One iteration only, but it scans both dicts on each step? 
first = {} 
second = {} 
for k, v in data(): 
    first[k] = v # this needs an underlying iteration over `first`, right? 
    second[k] = v # and this needs another underlying iteration over `second`.. 

# Is there aa.. multiple comprehension? 
first, second = {k: v + 1, k: 2 * v for k, v in data()} # SyntaxError 
# Would it be just equivalent to the previous loop? 
+0

你是什麼意思「這需要一個基礎迭代超過'第一'」?字典不需要迭代來分配新的項目,這是一個O(1)操作。 –

+0

第二個版本更好,但假設它甚至可能,單個理解沒有任何好處。只需使用兩個字典理解。 –

+0

複雜性是2O(n),它仍然是O(n)。如果您正在考慮速度和複雜性,兩者之間沒有顯着差異。 –

回答

3

你的第二個做法可能是最好的方式,加入一鍵一dict並不需要在這dict底層迭代。事實上,它的時間複雜度簡單地爲O(1),即恆定時間,並且與字典大小無關。

+0

不應該是O(1)嗎? –

+0

@aryamccarthy是的謝謝,你有犀利的眼睛! –

+0

令人驚歎!怎麼會這樣?無論如何,好消息:)謝謝:) –