2013-05-13 183 views
2

在下面的代碼,嵌套字典理解

[{word: score_tweet(tweet) for word in tweet} for tweet in tweets] 

我收到類型的字典列表:

[{u'soad': 0.0, u'<3': 0.0}, {u'outros': 0.0, u'acredita': 0.0}] 

我想只得到一個平坦的字典,如:

{u'soad': 0.0, u'<3': 0.0, u'outros': 0.0, u'acredita': 0.0} 

我應該如何更改我的代碼? 注意:我正在使用Python 2.7。

回答

3
{word: score_tweet(tweet) for tweet in tweets for word in tweet} 
+0

爲什麼在'tweet'和'word'這個關於'tweet'和'word'對稱的表達方式'word:score_tweet(tweet)'中,一個循環比另一個循環有優先權或者必須優先於其他優先權? – elyase 2013-05-13 00:17:31

+1

@elyase:因爲詞典理解直接映射到'tweet中的tweet:tweet中的單詞:foo [word] = score_tweet(tweet)',並且在理解中改變'for'表達式的順序對應於嘗試在tweet中寫'for word:在tweets中發推文:...',這顯然不起作用,因爲當你試圖將其元素分配給'word'時,tweet不存在。 – jwodder 2013-05-13 00:19:57

2

移動for循環到字典理解:

{word: score_tweet(tweet) for tweet in tweets for word in tweet} 

請記住,在一個線上的兩個for循環是很難讀。我會做這樣的事情,而不是:

scores = {} 

for tweet in tweets: 
    tweet_score = score_tweet(tweet) 

    for word in tweet: 
     scores[word] = tweet_score 
+1

不幸的是這一點讓'NameError:全局名稱 '鳴叫' 不defined' – elyase 2013-05-13 00:08:21

+0

@elyase:忘了你的第二個循環。謝謝。 – Blender 2013-05-13 00:09:06

+0

很好的答案,我不得不選擇一個。 – elyase 2013-05-13 00:22:29

0

你需要一箇中間步驟。

words = [] 
tweets = ["one two", "three four"] 
for tweet in tweets: 
    words.extend(tweet.split()) 
scores = {word: score_tweet(word) for word in words} 
0
""" 
[{u'soad': 0.0, u'<3': 0.0}, {u'outros': 0.0, u'acredita': 0.0}] 
-> 
{u'soad': 0.0, u'<3': 0.0, u'outros': 0.0, u'acredita': 0.0} 
""" 
tweets_merged = {} 
tweets = [{u'soad': 0.0, u'<3': 0.0}, {u'outros': 0.0, u'acredita': 0.0}] 
for tweet in tweets:  
    tweets_merged = dict(tweets_merged.items() + tweet.items()) 
print tweets_merged