2012-08-08 54 views
1

我與Twitter的API工作,我有這樣的Python代碼設置:改進列表理解

call_twitter = urllib2.urlopen("http://search.twitter.com/search.json?q=hello") 
tweets_json = json.loads(call_twitter.read()) 

的JSON API輸出的結構

/completed_in 
/stuff 
/stuff 
/results 
.../tweet1 
....../from_user 
....../tweet_text 
....../etc 
.../tweet2 
.../moretweets 

我嘗試最小的列表理解,以在內部字典中獲得鳴叫「from_user」和「text」屬性。我能做的最好的是,

call_twitter = urllib2.urlopen("http://search.twitter.com/search.jsonq=alhamdulillah") 
tweets_json = json.loads(call_twitter.read()) 

    for tweet in tweets_json['results']: 
     text = tweet['text'] 
     from_user = tweet['from_user'] 

我改進這,

text_list = [tweet['text'] for tweet in tweets_json['results']] 
from_user_list = [tweet['from_user'] for tweet in tweets_json['results']] 

我不知道如果「FROM_USER」和「文本」,將始終相互對應(按順序)當我將它們保存在2個不同的列表中時。有沒有辦法在一次迭代中抓住「text」和「from_user」而不使用for-loop?

我是一個Python菜鳥,但感謝提前的幫助:)

回答

4

你可以做

text_list = [(tweet['text'], tweet['from_user']) for tweet in tweets_json['results']] 

這會給你一個元組列表,每個元組是(text, user)

1

試試這個:

tweets = [(t['text'], t['from_user']) for t in tweets_json['results']] 

這會給你的表格的元組(tweet, user)

1

名單至於可讀性而言在可較好地保持原有循環。

tweets = [(tweet['text'], tweet['from_user']) for tweet in tweets_json['results']] 

至於建議由戈登·貝利獲得一個元組(text, user)所需信息的好方法。

就速度而言:列表理解可能會更好。

一般來說,如果你正在構建一個複合值,列表理解是可以接受的。如果你使用循環來產生副作用(例如打印),顯式循環更好。