1

我正在使用 twitter api,并且我有这个 python 代码设置:

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

api json输出的结构是

/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']]

当我将它们保存在 2 个不同的列表中时,我不确定“from_user”和“text”是否总是相互对应(按顺序)。有没有一种方法可以在一次迭代中同时获取“文本”和“from_user”而不使用 for 循环?

我是python菜鸟,但提前感谢您的帮助:)

4

3 回答 3

4

你可以做

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

这将为您提供一个元组列表,每个元组为(text, user).

于 2012-08-08T20:03:19.147 回答
1

尝试这个:

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

这将为您提供表单的元组列表(tweet, user)

于 2012-08-08T20:04:38.343 回答
1

就可读性而言,保留原始for 循环可能会更好。

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

正如 Gordon Bailey 所建议的那样,这是在 tuple 中获取所需信息的好方法(text, user)

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

通常,如果您要构建复合值,则可以接受列表推导。如果您使用循环是因为它的副作用(例如打印),那么显式循环会更好。

于 2012-08-08T20:08:32.697 回答