2017-05-03 41 views
-3

假設存在一個字符串'Hello World',並且我希望使用字典來獲取元素及其頻率的映射,但下面的代碼確實足夠,但是如果我需要使用列表理解,我怎麼用'if','else'?請提供您的解決方案轉換if-else以簡化列表理解

for i in s: 
    if i in d: 
     d[i]=d[i]+1 
    else: 
     d[i]=1 
+0

更簡潔:使用'collections.Counter'或'collections.defaultdict(int)' –

+0

您不是從您的輸入元素構建列表。你**數**你的元素。使用'Counter()'。 –

+0

我正在尋找將其轉換爲列表理解的方法,請爲此提供解決方案。我可以在以後看 –

回答

1

您可以使用字典解析(它沒有意義的,使用列表理解來構建一個字典):

s = 'Hello world' 
d = {char: s.count(char) for char in set(s)} 

set(s)是一組獨特的在你的字符串中的字符,並且理解用字符作爲關鍵字和出現次數(使用str.count)作爲值創建字典。

但是你根本不需要理解,python自帶了「包含電池」。在這種情況下,電池collections.Counter

import collections 
collections.Counter(s) 

如果你真的想用一個列表理解(我的個人意見:沒有這樣做,不應該),你需要使用的的副作用,例如:

s = 'Hello world' 
d = {} 
[d.__setitem__(i, d[i]+1) if i in d else d.__setitem__(i, 1) for i in s] 
print(d) 

__setitem__調用是必要的,因爲d[i] = 1d[i] = d[i] + 1是分配和因此在推導禁止的。但__setitem__是功能替代。

+0

開啓!你能否提供處理if-else在列表理解方面的觀點 –

+0

@AshwinV我添加了「if」和「else」列表理解的例子。它與您的循環相當,但是基於副作用。作爲一種智力練習,這很有趣,但通常你不應該因爲副作用而去理解。 – MSeifert

+1

當然 - 這裏列表comp是如此之多的錯誤...所以不要這樣做:) –