2016-02-21 49 views
4

我期待在一個適當的方式扁平化這樣的事情這是一個可以接受的方式來扁平列表的字典嗎?

a = [{'name': 'Katie'}, {'name': 'Katie'}, {'name': 'jerry'}] 

d = {} 

使用雙地圖是這樣的:

map(lambda x: d.update({x:d[x]+1}) if x in d else d.update({x:1}),map(lambda x: x["name"] ,a)) 

我得到我想要的結果:

>>> d 
{'jerry': 1, 'Katie': 2} 

但我覺得它可以做得更好..不是列表理解壽,我覺得這是我們有地圖減少。

+0

可以有多個鍵,還是總是'名'? – timgeb

+0

總是名字......我只想重複以這種格式出現的重複名字......如果您知道我的意思 –

+0

有任何答案能夠充分解決您的問題嗎? – timgeb

回答

8

我不太喜歡你的解決方案,因爲它很難閱讀並且有副作用。

對於您提供的示例數據,使用Counter(它是內置字典的子類)是更好的方法。

>>> Counter(d['name'] for d in a) 
Counter({'Katie': 2, 'jerry': 1}) 
+0

非常優雅非常感謝你! –

+0

另外,最後一個q,當你指副作用時,你指的是通過修改範圍之外的變量(在這種情況下是d)違反函數式編程方法? –

+0

@JeronimoGarcia,在python中,除非你使用的是容器中的東西,不要創建一個,也就是說'不需要my_list = []; [my_list.append(I + foo)for i in blah]' –

4

您可以使用一個計數器,並保持它的功能:

In [46]: from collections import Counter 

In [47]: from operator import itemgetter 

In [48]: Counter(map(itemgetter("name") ,a)) 
Out[48]: Counter({'Katie': 2, 'jerry': 1}) 

對於Python 2,你會用itertools.imap

Counter(itertools.imap(itemgetter("name") ,a)) 
+0

'map'不理解'map' - 請參閱BDFL的[意見](http://www.artima.com/weblogs/viewpost.jsp?thread=98196) – AChampion

+2

@AChampion,map更快,廣泛應用於python,從我在鏈接中看到的主要論點是準備一個我很少使用的lambda,如果我不能使用map而不訴諸lambda,那麼我很少這樣做。我認爲'map(float,lst)'和'[float in s in st]'一樣可讀。 –

1

再次使用計數器,但提取的字典。

>>> dict(Counter([i['name'] for i in a])) 
{'Katie': 2, 'jerry': 1} 

這裏有一個更令人費解的方法使用GROUPBY:

from itertools import groupby 

>>> dict((name, len(list(totals))) for name, totals in groupby([i["name"] for i in a])) 
{'Katie': 2, 'jerry': 1} 
+2

爲什麼不''字典(計數器(我['名字']我在a))'如果你想要一個正規的字典? –

+0

我一定有更好的方法。我很驚訝沒有'.to_dict()'計數器的方法。 – Alexander

+0

@Alexander很好,一個Counter *是-a *字典,所以我不希望有這樣的方法。 – timgeb

1
from collections import defaultdict 
val = defaultdict(int) 
for names in a: 
    val[names['name']] += 1 
+0

與計數器基本相同,但更多代碼 –

2

在這種情況下reduce()會更合適,然後map()

>>> def count_names(d, x): 
...  d[x['name']] = d.get(x['name'], 0) + 1 
...  return d 
... 
>>> reduce(count_names, a, {}) 
{'jerry': 1, 'Katie': 2} 
+0

我也喜歡這一個 –

+0

特別是get()的默認參數,我不知道它是可能的! –

1

for循環是你的朋友:)

a = [{'name': 'Katie'}, {'name': 'Katie'}, {'name': 'jerry'}] 
result = {} 
for data in a: 
    if data['name'] not in result: 
     result[data['name']] = 0 
    result[data['name']] += 1 
print result 
相關問題