什么是通过属性构建DictionaryLists Dict的Pythonic方法?

2024-05-12 19:30:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找pythonic方法来转换元组列表,如下所示:

 res = [{type: 1, name: 'Nick'}, {type: 2, name: 'Helma'}, ...]

这样口述:

 {1: [{type: 1, name: 'Nick'}, ...], 2: [{type: 2, name: 'Helma'}, ...]}

现在我使用这样的代码(based on this question):

 d = defaultdict(list) 
 for v in res:
    d[v["type"]].append(v)

这是一种按属性构建对象列表的Pythonic方法吗?你知道吗


Tags: 方法代码name列表ontyperesthis
2条回答

你可以通过词典理解来完成,而不是像评论所说的那样难以辨认或难以理解(IMHO):

# A collection of name and type dictionaries
res = [{'type': 1, 'name': 'Nick'},
       {'type': 2, 'name': 'Helma'},
       {'type': 3, 'name': 'Steve'},
       {'type': 1, 'name': 'Billy'},
       {'type': 3, 'name': 'George'},
       {'type': 4, 'name': 'Sylvie'},
       {'type': 2, 'name': 'Wilfred'},
       {'type': 1, 'name': 'Jim'}]

# Creating a dictionary by type
res_new = {
    item['type']: [each for each in res
                   if each['type'] == item['type']]
    for item in res
}

>>>res_new
{1: [{'name': 'Nick', 'type': 1},
     {'name': 'Billy', 'type': 1},
     {'name': 'Jim', 'type': 1}],
 2: [{'name': 'Helma', 'type': 2},
     {'name': 'Wilfred', 'type': 2}],
 3: [{'name': 'Steve', 'type': 3},
     {'name': 'George', 'type': 3}],
 4: [{'name': 'Sylvie', 'type': 4}]}

除非我漏掉了什么,否则这会给你你想要的结果。你知道吗

我同意评论员的观点,在这里,列表理解将缺乏理解。你知道吗

话虽如此,但我们可以这样做:

import itertools

a = [{'type': 1, 'name': 'Nick'}, {'type': 2, 'name': 'Helma'}, {'type': 1, 'name': 'Moshe'}]
by_type = lambda a: a['type']  
>>> dict([(k, list(g)) for (k, g) in itertools.groupby(sorted(a, key=by_type), key=by_type)])
{1: [{'name': 'Nick', 'type': 1}, {'name': 'Moshe', 'type': 1}], ...}

代码首先按'type'排序,然后使用^{}按完全相同的标准分组。你知道吗


写完代码15秒后,我就不再理解它了:-)

相关问题 更多 >