簡體   English   中英

關於使用python中的列表過濾字典的問題

[英]question about filtering a dictionary using a list in python

具有以下字典和數組:

a = { 'a':[1,2,3,4,5], 'b':[1,2,3], 'c':[1,2,3,4,5] }
b = ['a','c']

我想將a過濾到一個新的字典中,以僅將鍵值包含在數組b中,所以我最終得到:

c = {'a': [1, 2, 3, 4, 5], 'c': [1, 2, 3, 4, 5]}

因此,對我來說,顯而易見的方法如下:

(1) dict(map( lambda x:(x,a[x]), b))

尋找不同的方式來做到這一點,我也看到了:

(2) dict( (x, a[x]) for x in b)

我沒有完全掌握(2),但是在我深入研究正在發生的事情之前,使用(2)勝過(1)有優勢嗎? 還是更好,但是有更好的方法嗎?

內置的map()始終可以由列表理解代替。 通話

map(callable, iterable)

相當於

[callable(x) for x in iterable]

如果callable是lambda表達式,則后者的形式更快且更具可讀性,這就是在這種情況下首選它的原因。

如果您真的不需要map()返回的列表,而只需要另一個“可迭代”,則也可以用生成器表達式替換map()調用

(callable(x) for x in iterable)

這不會立即創建所有項目。 在迭代生成器時,只能一一創建項。

在您的示例中, dict構造函數僅需要一個可迭代的對象,它將對直接將所有項目插入新dict實例的插入對象進行迭代。 您不需要列表理解或對map()的調用將創建的中間列表。

您的選項(2)比(1)更快,使用更少的內存,更簡潔,並且(我認為)比(1)更具可讀性。

使用python 2.7和3.0語法:

{ k:a[k] for k in b  } 

(2)的優點是它使用生成器來生成鍵值元組,因此可以避免N的方法調用對(1)造成的lambda x()的開銷。

暫無
暫無

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

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