繁体   English   中英

从字典建立元组列表

[英]Build a List of Tuples from a Dict

我有一个字典的键列表y ,该字典是从对Google Places API的调用派生而来的。

我想为每个兴趣点建立一个元组列表:

lst = []
for i in range(len(y)):
    lst.append((y[i]['name'], y[i]['formatted_address'], y[i]['opening_hours']['open_now'], y[i]['rating']))

如果该字段在列表中,并且我收到的结果列表类似于下面的结果,则这是我想要的:

("Friedman's", '1187 Amsterdam Ave, New York, NY 10027, USA', True, 4.2)

但是,如果所需字段不在列表y ,则脚本将引发错误。 如何构建元组列表,以在构建元组之前检查所需字段是否在y

这是我尝试过的:

    for i in range(len(y)):
        t = ()
        if y[i]['name']:
            t = t + lst.append(y[i]['name'])
        if y[i]['formatted_address']:
            t = t + lst.append(y[i]['formatted_address'])
        if y[i]['opening_hours']['open_now']:
            t = t + lst.append(y[i]['opening_hours']['open_now'])
        if y[i]['rating']:
            t = t + lst.append(y[i]['rating'])
    lst.append(t)

但是,这行不通,而且看起来很不雅致。 有什么建议么?

首先,您几乎永远都不要循环超出范围(len(something))。 总是直接遍历事物。 这大大减少了代码的繁琐。

对于实际问题,您可以遍历键并仅在dict中添加项目。 使用嵌套查找的一个元素会使情况变得更加复杂,但是如果将其删除,则代码将变成:

for item in y:
    lst.append(tuple(item[key] for key in ('name', 'formatted_address', 'opening_hours', 'rating') if key in item))

当其中一个键不存在时(使用dict.get() ),此列表理解将使用默认值。 我添加了变量,以便您可以设置所需的默认值。

default_name = ''
default_address = ''
default_open_now = False
default_rating = 0.0

new_list = [
    (
        e.get('name', default_name),
        e.get('formatted_address', default_address),
        e.get('opening_hours', {}).get('open_now', default_open_now),
        e.get('rating', default_rating),
    )
    for e in y]

您可以使用dictget功能。

y[i].get('name')

如果y[i]具有键'name'返回值或None 对于嵌套字典,请使用get default值。

y[i].get('opening_hours', {}).get('open_now')

对于数据结构,建议将其保留为字典,然后将字典添加到列表中。

lst = []
lst.append({'name': "Friedman's", "address": '1187 Amsterdam Ave, New York, NY 10027, USA'})

尝试这个:

for i in y:
    lst.append((v for k,v in i.items()))

您可以使用keys方法在字典中查找键。 在您的情况下:

lst=[]
fields = ('name', 'formatted_address', 'opening_hours' 'open_now', 'rating')
for i in range(len(y)):
    data = []
    for f in fields:
        if f in y[].keys():
            data.append(y[i][f])
        else:
            data.append(None)
    lst.append(set(data))

请注意,您还可以使用items()方法获取字典中所有键,值对。 那实际上只是简单的代码。 为了使它更好,请遍历该集合,而不要调用len(set):

lst=[]
fields = ('name', 'formatted_address', 'opening_hours' 'open_now', 'rating')
for i in y:
    data = []
        for key, value in i.items():
        if key in fields:
            data.append(value)
        else:
            data.append(None)
    lst.append(set(data))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM