Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅当条件为true时才将元组添加到字典_Python_Dictionary - Fatal编程技术网

Python 仅当条件为true时才将元组添加到字典

Python 仅当条件为true时才将元组添加到字典,python,dictionary,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",

以下代码:

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

你知道如何修改上面的代码以支持这两种情况吗?

我会在这里使用一个函数生成字典:

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()]
例如,对于处理类似位置的
json.dumps()
函数,可以使用自定义的
default
函数

您还可以在事件发生后进行过滤:

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

的值。我将在此处使用函数生成字典:

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()]
例如,对于处理类似位置的
json.dumps()
函数,可以使用自定义的
default
函数

您还可以在事件发生后进行过滤:

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

的值,而不是调整代码,另一种方法是添加后处理步骤。这将更清晰地阅读,并使您的意图更加明显

实施

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}

另一种方法是添加后处理步骤,而不是调整代码。这将更清晰地阅读,并使您的意图更加明显

实施

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}

@MartijnPieters:我理解,但这会给这种方法带来问题。毕竟,最终结果只有来自属性或方法调用的值。也许是我没有;我不明白你的意思。@Abhijit:这个Json包含数千个位置,其中一半可能没有lat/lng-这就是为什么我要放弃它们。。(简写为json)但是谢谢你的建议@MartijnPieters:我看到你用类似于我的答案来补充你的答案。你想让我删除这个答案吗?因为它只会复制回复而没有任何好处。@Abhijit:我不会因为我们的内容有重叠就要求其他人删除帖子。:-)竞争是好的@伊泰布:我明白。在这种情况下,您可能需要评估备选方案approach@MartijnPieters:我理解,但这会给这种方法带来问题吗。毕竟,最终结果只有来自属性或方法调用的值。也许是我没有;我不明白你的意思。@Abhijit:这个Json包含数千个位置,其中一半可能没有lat/lng-这就是为什么我要放弃它们。。(简写为json)但是谢谢你的建议@MartijnPieters:我看到你用类似于我的答案来补充你的答案。你想让我删除这个答案吗?因为它只会复制回复而没有任何好处。@Abhijit:我不会因为我们的内容有重叠就要求其他人删除帖子。:-)竞争是好的@伊泰布:我明白。在这种情况下,您可能需要评估替代方法,我想我将使用您的上层解决方案。关于第二个问题:1。在使用python 2.7.6时。2.我更喜欢只在这些地方转一圈-这样会更有效率-谢谢@伊泰布:我完全同意!我想我会用你的上解。关于第二个问题:1。在使用python 2.7.6时。2.我更喜欢只在这些地方转一圈-这样会更有效率-谢谢@伊泰布:我完全同意!