将 2-dicts 列表缩减为一个项目唯一的列表,连接 python3 中的其他项目

Reduce a list of 2-dicts, to a list unique by the one item, concatenating the other items in python3

我正在尝试转换一些数据:

[
 {'delim_type': '', 'arcana_list': 'Life 3'}, 
 {'delim_type': ' and/or ', 'arcana_list': 'Mind 3'}, 
 {'delim_type': ' and/or ', 'arcana_list': 'Prime 3'},
]

看起来像这样:

[
 {'delim_type': '', 'arcana_list': 'Life 3'}, 
 {'delim_type': ' and/or ', 'arcana_list': ['Mind 3', 'Prime 3']}, 
]

基本上在 delim 类型相同的情况下,将 arcana_list 项中的一项附加到另一项。

我试图查找压缩和链式 iter 之类的东西,但我找不到一个简短的 pythonic 方法来执行此操作而不解压缩然后重新打包它。我觉得它应该可以通过列表理解来实现,但是我的 python-fu 很弱。

我敢肯定有更巧妙的方法可以做到这一点,但这是我想出的方法

def combineDicts(old):
    from itertools import groupby
    new = []
    for k,g in groupby(l, lambda i: i['delim_type']):
        d = {'delim_type':k}
        d['arcana_list'] = ', '.join(i['arcana_list'] for i in g)
        new.append(d)
    return new

测试

>>> old = [
            {'delim_type': '', 'arcana_list': 'Life 3'}, 
            {'delim_type': ' and/or ', 'arcana_list': 'Mind 3'}, 
            {'delim_type': ' and/or ', 'arcana_list': 'Prime 3'},
          ]

>>> combineDicts(old)
[{'arcana_list': 'Life 3', 'delim_type': ''},
 {'arcana_list': 'Mind 3, Prime 3', 'delim_type': ' and/or '}]
[
 {'delim_type': '', 'arcana_list': 'Life 3'}, 
 {'delim_type': ' and/or ', 'arcana_list': 'Mind 3, Prime 3'}, 
]

除非您坚持使用上述格式,否则我会怎么做:

将是以下格式(这样更容易查找):

{' and/or ': ["mind 3", "prime 3"], 
' ': 'Prime 3'} 

这很容易做到:

from collections import defaultdict
d = defaultdict(list) 
for node in my_list: 
    d[node['delim_type']].append(node['arcana_list'])

如果字符串比列表更可取,您当然可以使用 defaultdict(str)+= ', '(虽然我不确定那会是什么时候)。

示例:

my_list = [
 {'delim_type': '', 'arcana_list': 'Life 3'}, 
 {'delim_type': ' and/or ', 'arcana_list': 'Mind 3'}, 
 {'delim_type': ' and/or ', 'arcana_list': 'Prime 3'},
]

输出:

defaultdict(<class 'list'>, {'': ['Life 3'], ' and/or ': ['Mind 3', 'Prime 3']})

用法:

In [19]: d['']
Out[19]: ['Life 3']

In [20]: d[' and/or ']
Out[20]: ['Mind 3', 'Prime 3']