Python根据对象属性将对象列表拆分为子列表

时间:2018-05-24 09:11:31

标签: python list lambda

我有这样的清单:

original_list = [
    {
        amenity: "Parking",
        amount: 120,
        version: 1,
        percentage: 4,
        id: 1
    },
    {
        amenity: "Pool",
        amount: 300,
        version: 2,
        percentage: 10,
        id: 5,
    },
    {
        amenity: "Pool",
        amount: 200,
        version: 1,
        percentage: 10,
        id: 2
}]

因此,正如您所看到的,列表中有两个具有舒适度的对象" Pool",如何根据舒适度将此列表分成较小的列表:

例如:

vlist_a = [{
    amenity: "Parking",
    amount: 120,
    version: 1,
    percentage: 4,
    id: 1
}]

list_b = [{
    amenity: "Pool",
    amount: 300,
    version: 2,
    percentage: 10,
    id: 5,
},
{
    amenity: "Pool",
    amount: 200,
    version: 1,
    percentage: 10,
    id: 2
}]

我的目的是当我以这种方式命令它时,我可以使用lambda方程得到每个列表中具有最大版本的对象。

提前致谢

1 个答案:

答案 0 :(得分:3)

使用字典表示可变数量的变量

Pythonic解决方案是使用collections.defaultdict

from collections import defaultdict

d = defaultdict(list)

for item in original_list:
    d[item['amenity']].append(item)

print(d['Pool'])

[{'amenity': 'Pool', 'amount': 300, 'id': 5, 'percentage': 10, 'version': 2},
 {'amenity': 'Pool', 'amount': 200, 'id': 2, 'percentage': 10, 'version': 1}]

print(d['Parking'])

[{'amenity': 'Parking', 'amount': 120, 'version': 1, 'percentage': 4, 'id': 1}]
  

我的意图是,当我以这种方式订购时,我可以得到它   每个列表使用lambda方程的最大版本的对象。

您可以将max字典理解用于此任务:

res = {k: max(v, key=lambda x: x['version']) for k, v in d.items()}

{'Parking': {'amenity': 'Parking',
  'amount': 120,
  'id': 1,
  'percentage': 4,
  'version': 1},
 'Pool': {'amenity': 'Pool',
  'amount': 300,
  'id': 5,
  'percentage': 10,
  'version': 2}}