我有一个字典的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)
但是,这是行不通的,而且看起来很不雅致。有什么建议吗?
答案 0 :(得分:2)
一开始,您几乎应该绝不超过范围(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))
答案 1 :(得分:2)
当其中一个键不存在时(使用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]
答案 2 :(得分:1)
您可以使用dict
中的get
功能。
y[i].get('name')
如果y[i]
具有键'name'
,则返回值或None
。对于嵌套字典,请使用default
中的get
值。
y[i].get('opening_hours', {}).get('open_now')
对于数据结构,我建议将其保留为字典,并将字典添加到列表中。
lst = []
lst.append({'name': "Friedman's", "address": '1187 Amsterdam Ave, New York, NY 10027, USA'})
答案 3 :(得分:0)
尝试一下:
for i in y:
lst.append((v for k,v in i.items()))
答案 4 :(得分:0)
您可以使用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))