仅当条件为真时才将元组添加到字典中

时间:2014-01-30 14:46:22

标签: python dictionary

以下代码:

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"
},
...

任何想法如何调整上面的代码,以便它支持这两种情况?

2 个答案:

答案 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}
相关问题