在python中检查一个dict中的键值是否相同。

问题描述 投票:0回答:1

我在这道题中问到,当一个对象内部的列表为空时,如何删除该对象(如果Python中的空列表中的对象被删除).问题是,我只想在以下情况下这样做 objectId 值是一样的。我有其他对象的id不同,我不想碰它。

输入。

data = [{
"objectID": 10745,
"results": [
{
    "model": "AUDI - TT QUATTRO",
    "price_str": "4 800 EUR"
}]
},
{
"objectID": 10745,
"results": []
},
"objectID": 10746,
"results": [
{
    "model": "Porsche 911",
    "price_str": "48 000 EUR"
}]
},

]

我的代码。

for item in data:
        objectId = item["objectID"]
        results = item["results"]

        def removeDuplicate():
            #if objectid are the same
            new_data = [item for item in data if item['results']]
            data[:] = new_data
        removeDuplicate()

预期的输出。

    [{'objectID': 10745, 
  'results': [{'model': 'AUDI - TT QUATTRO', 'price_str': '4 800 EUR'}]}, {'objectID': 10746, 
  'results': [{'model': 'Porsche 911', 'price_str': '48 000 EUR'}]}]
python
1个回答
2
投票

虽然可能不快,但很短。

data = [{
        "objectID": 10745,
        "results": [{
            "model": "AUDI - TT QUATTRO",
            "price_str": "4 800 EUR"
        }]
    },
    {
        "objectID": 10745,
        "results": []
    },
    {
        "objectID": 10746,
        "results": [{
            "model": "Porsche 911",
            "price_str": "48 000 EUR"
        }]
    },
    { # add a test example
        "objectID": 10747,
        "results": []
    }
]
r = [d for i,d in enumerate(data) if d['objectID'] not in set(map(lambda x:x['objectID'],data[:i])) or d['results']]
print(r)

结果:你需要将你的条件调整为

[{
    'objectID': 10745,
    'results': [{
        'model': 'AUDI - TT QUATTRO',
        'price_str': '4 800 EUR'
    }]
}, {
    'objectID': 10746,
    'results': [{
        'model': 'Porsche 911',
        'price_str': '48 000 EUR'
    }]
}, {
    'objectID': 10747,
    'results': []
}]

1
投票

你需要调整你的条件。

new_data = [item for item in data if item['results'] and objectId != item["objectID"]]

1
投票

你可以使用 itertools.groupby 但你需要对数据进行分类。我会使用 operator.itemgetter 为钥匙。

from itertools import groupby
from operator import itemgetter

data = [...]

osort = itemgetter('objectID')
sorted_data = sorted(data, key=osort)

output = [next(o for o in g if o['results']) for _, g in groupby(sorted_data, osort)]
© www.soinside.com 2019 - 2024. All rights reserved.