以下代码:
json_c = [dict([("id", place.id),
("address", place.address),
("city", place.city),
("lat", place.lat()),
("lng", place.lng())]) for place in dataset.places.all()]
生成以下Json:
[{
city: "city1",
id: "1",
address: "address1",
lat: 32.070123,
lng: 34.7938112
},
{
city: "city2",
id: "2",
address: "address2",
lat: 35.7938112,
lng: 30.7938112
},
...]
函数:place.lat()
和place.lng()
可以返回None
:在这种情况下,我想省略lat / lng字段并生成如下内容:
{
city: "city3",
id: "3",
address: "address3"
},
...
任何想法如何调整上面的代码,以便它支持这两种情况?
答案 0 :(得分:4)
我在这里使用函数来生成字典:
def serialize_place(place):
res = dict(id=place.id, address=place.address, city=place.city)
lat, lng = place.lat(), place.lng()
if lat is not None:
res['lat'] = lat
if lng is not None:
res['lng'] = lng
return res
json_c = [serialize_place(place) for place in dataset.places.all()]
例如,或者为default
函数使用自定义json.dumps()
函数来处理类似的地方。
你也可以在事后过滤:
json_c = [{k: v for k, v in d.iteritems() if v is not None} for d in json_c]
(在Python 3中使用d.items()
),这将删除None
字典中的所有值。
答案 1 :(得分:2)
不是调整代码,另一种方法是添加后处理步骤。这样会更清晰,让你的意图更明显
<强>实施强>
data=[{
'city': "city1",
'id': "1",
'address': "address1",
'lat': 32.070123,
'lng': 34.7938112
},
{
'city': "city2",
'id': "2",
'address': "address2",
'lat': None,
'lng': None
}]
# Remove any non existing values
data = [{key:value for key, value in item.items() if value} for item in data]
<强>输出强>
pprint.pprint(data)
[{'address': 'address1',
'city': 'city1',
'id': '1',
'lat': 32.070123,
'lng': 34.7938112},
{'address': 'address2', 'city': 'city2', 'id': '2'}]
另一种方法
这里我基本上创建了一个生成器,这样你只需要迭代一次列表。这对于较大的列表基本上是有效的。
from itertools import izip
keys = ["id", "address", "city", "lat", "lng"]
json_c = ((key, getattr(key)) for place, key in izip(dataset.places.all(), keys))
json_c = {key: value for key, value in json_c if value}