2013-07-15 90 views
3

我試圖創建我認爲是從更大的字典空間到更小的維度空間的「投影」。所以,如果我有:詞典投影,過濾器或子集的Python列表?

mine = [ 
{"name": "Al", "age": 10}, 
{"name": "Bert", "age": 15}, 
{"name": "Charles", "age": 17} 
] 

我試圖找到一個函數表達式只返回:

[ 
{"name": "Al"}, 
{"name": "Bert"}, 
{"name": "Charles"} 
] 

我試過......

>>> filter(lambda x: x['name'],mine) 
[{'age': 10, 'name': 'Al'}, {'age': 15, 'name': 'Bert'}, {'age': 17, 'name': 'Charles'}] 
>>> map(lambda x : x['name'],mine) 
['Al', 'Bert', 'Charles'] 

但似乎仍然缺少正確的功能。我知道如何做一個列表理解,但想學習如何在功能上做到這一點。

回答

16

聽起來像列表解析工作,無論你喜歡與否。

>>> [{"name": d["name"]} for d in mine] 
[{'name': 'Al'}, {'name': 'Bert'}, {'name': 'Charles'}] 

沒有列表理解該解決方案將需要額外的功能定義:

def project(key, d): 
    return {k: d[k]} 

map(partial(project, "name"), mine) 

還是一個lambda(呸):

map(lambda d: {"name": d["name"]}, mine) 
+1

你拉姆達版本回報'[組([ '基地', '名']),集合([ '伯特', '名']),集( ['查爾斯','名字'])]',啊知道了,用冒號替換逗號。 – Mittenchops

+0

@Mittenchops:哎呀,修正了這個問題。 –

+0

對,呃,當然很簡單......嘆氣。謝謝。 – Mittenchops

0

CODE:

print([{'name': d['name']} for d in mine]) 

OUTPUT:

[{'name': 'Al'}, {'name': 'Bert'}, {'name': 'Charles'}]