Python 从Dict构建元组列表

Python 从Dict构建元组列表,python,python-3.x,Python,Python 3.x,我有一个字典中的键列表y,它是通过调用googleplacesapi得到的 我想为每个关注点建立一个元组列表: 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'])) 如果字段在列表中,并且我收到一个结果列表,该列表与下面的列表类似,这正是我想要的: ("Friedma

我有一个字典中的键列表
y
,它是通过调用
googleplacesapi
得到的

我想为每个关注点建立一个元组列表:

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(某物))。始终直接迭代对象。这将大大降低代码的不雅程度

对于实际问题,您可以循环键并仅添加dict中的项。对于嵌套查找的一个元素,这会变得有点复杂,但如果将其取出,则代码将变为:

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

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

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

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()方法获取dict中的所有键、值对。这实际上只是代码的一部分。为了让它变得更好,请对集合进行编辑,而不是调用len(set)来:


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

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]
您可以使用
dict
中的功能

y[i].get('name')
如果
y[i]
具有键
'name'
则返回值或
None
。对于嵌套dict,使用
get
中的
default

y[i].get('opening_hours', {}).get('open_now')
对于数据结构,我建议将其保留为dict,并将dict添加到列表中

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

dict.get()?你想要设置为“无”还是完全跳过该元组?我怀疑你想要一个大小不同的元组列表;如果元组比平时短,你怎么知道哪个字段实际上丢失了。如果dict中没有键,我会将其设置为“无”。因此,如果没有可用的
rating
,示例元组的值将为
none
lst = []
lst.append({'name': "Friedman's", "address": '1187 Amsterdam Ave, New York, NY 10027, USA'})