我在这道题中问到,当一个对象内部的列表为空时,如何删除该对象(如果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'}]}]
虽然可能不快,但很短。
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': []
}]
你需要调整你的条件。
new_data = [item for item in data if item['results'] and objectId != item["objectID"]]
你可以使用 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)]