从嵌套列表中获取不同元素的列表

3

我是一个从javascript/nodeJS背景下转到Python的新手。我有一个带有嵌套列表的Python字典,但是我却很难访问其中的内容。我需要提取出嵌套列表,以便检查唯一的电子邮件地址。以下是我的GET请求返回的内容:

{"data": [{"login_date": "2014-04-17T19:14:29+08:00", "email": "walter.elwyn@yahoo.com"}, {"login_date": "2014-04-22T09:31:56+04:00", "email": "helyn67@cruickshankmckenzie.com"}]

实际返回的数据字典要长得多,但你明白了...所以我有两个问题:

  1. 如何在内容字典中通过电子邮件访问特定点

  2. 如何循环遍历字典以获取唯一的电子邮件?

这是我的代码:

from flask import Flask
import requests
import urllib2
app = Flask(__name__)


@app.route('/')
def hello_world():
    content = urllib2.urlopen('https://9g9xhayrh5.execute-api.us-west-2.amazonaws.com/test/data').read()

    print content

        return 'check console'

if __name__ == '__main__':
    app.run()

如果你只有一个条目,为什么要使用字典? - Zachi Shtain
我没有编写API。 - Adam Weitzman
所以 content 是你的字典? - Zachi Shtain
是的,抱歉我应该写清楚。 - Adam Weitzman
1个回答

2
如果您有这样的结构:
>>> response = {"data": [{"login_date": "2014-04-17T19:14:29+08:00", "email": "walter.elwyn@yahoo.com"}, {"login_date": "2014-04-22T09:31:56+04:00", "email": "helyn67@cruickshankmckenzie.com"}]}

那么你所拥有的是一个带有键 data 的字典。
>>> response['data']
[{'login_date': '2014-04-17T19:14:29+08:00', 'email': 'walter.elwyn@yahoo.com'}, {'login_date': '2014-04-22T09:31:56+04:00', 'email': 'helyn67@cruickshankmckenzie.com'}]

你可以使用列表推导式获取电子邮件列表:
>>> [user['email'] for user in response['data']]
['walter.elwyn@yahoo.com', 'helyn67@cruickshankmckenzie.com']

如何遍历字典以获取唯一的电子邮件? 为了使该列表唯一,您可以使用集合推导式: ```python unique_emails = {email for email in my_dict.values()} ```
>>> {user['email'] for user in response['data']} 
set(['helyn67@cruickshankmckenzie.com', 'walter.elwyn@yahoo.com'])

如何通过电子邮件访问内容字典中的特定点

如果您想过滤给定的电子邮件,可以使用 filter()

>>> filter(lambda user: user['email'] == 'walter.elwyn@yahoo.com', response['data'])
[{'login_date': '2014-04-17T19:14:29+08:00', 'email': 'walter.elwyn@yahoo.com'}]

如果我在我的情况下执行content ['data],我会收到内部服务器错误

这是因为要执行 content ['data'] , content 需要是类似字典的对象。 让我们使用 requests 库来完成您想要的操作:

>>> import requests
>>> content = requests.get('https://9g9xhayrh5.execute-api.us-west-2.amazonaws.com/test/data')
>>> response = content.json() # reads the data as JSON, into a dict-like object
>>> response.keys()
[u'data']

现在你可以使用response['data']

为了获取唯一的电子邮件ID,{user['email'] for user in response['data']} - noorul
好的,我明白了。但是让我感到困惑的是,如果我在我的情况下执行response['data']... content['data],会导致内部服务器错误。 - Adam Weitzman
这里是@AdamWeitzman,一个使用requests而不是urllib2的工作代码片段,希望这样可以。你可能会喜欢https://dev59.com/V2855IYBdhLWcg3wNhZ1#4476389 - bakkal
好的,非常感谢您的帮助。似乎当我使用print response['data']时,在终端中会得到JSON输出并在浏览器中出现内部服务器错误。当我使用return response['data']时,各种错误都会出现,这是怎么回事? - Adam Weitzman
使用app.run(debug=True)运行您的Flask应用程序并查找,我认为问题与我的答案无关,因为我粘贴的代码片段是实时运行的 :) - bakkal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接