将 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']
我正在尝试转换一些数据:
[
{'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']