将两个元组列表合并为单个字典列表的Pythonic方法

8

你好,我是一名新手,对Python不是很熟悉,还不了解所有的小技巧和快捷方式。我有两个多维数组:

>>> colorStrings
[('0', '2371_9890_020'), ('1', '2371_9031_100'), ('2', '2371_9890_464')]

并且

>>> skus
[('0', '0017651670'), ('0', '0017651688'), ('0', '0017651696'), ('0', '0017651704'), ('0', '0017651712'), ('0', '0017651720'), ('0', '0017651738'), ('1', '0017650896'), ('1', '0017650904'), ('1', '0017650912'), ('1', '0017650920'), ('1', '0017650938'), ('1', '0017650946'), ('1', '0017650953'), ('2', '0017651746'), ('2', '0017651753'), ('2', '0017651761'), ('2', '0017651779'), ('2', '0017651787'), ('2', '0017651795'), ('2', '0017651803')]

基本上,我想将它们合并成一个字典对象数组。就像这样:
[
{
   'colorString': '2371_9890_020'
   'skus': ('0017651670', '0017651688', '0017651696', '0017651704', '0017651712', '0017651720, '0017651738')
},

{
   'colorString': '2371_9031_100'
   'skus': ('0017650896', '0017650904', '0017650912', '0017650920', '0017650938', '0017650946, '0017650953')
},

{
   'colorString': '2371_9890_464'
   'skus': ('0017651746', '0017651753', '0017651761', '0017651779', '0017651787', '0017651795, '0017651803')
}
]

有没有一些酷炫的Pythonic方式可以使用Lambda表达式或其他巧妙方法轻松完成这个任务?谢谢!

groupby 函数来自 itertools 模块,也可以帮助你! - shahjapan
2个回答

10

试试这个:

 result = [
     {
         'colorString' : color, 
         'skus' : [value for key, value in skus if key is colorkey]
     } for colorkey, color in colorStrings 
 ]

决定将此标记为答案,因为我喜欢它... 虽然defauldict()方法也非常不错... - Mike Christensen
这可能非常低效,因为它必须在每个颜色字符串条目中每次迭代colorKey - Imran
是的,我也注意到了 - 不过,我的两个列表始终都很小...每个列表可能不到10个项目。而且这段代码并不是关键性能代码。 - Mike Christensen

9
使用 defaultdict 将 SKU 按照 SKU ID 分组,然后使用列表推导式生成合并的数据集。
from collections import defaultdict

sku_dict = defaultdict(list)
for color_id, sku in skus:
    sku_dict[color_id].append(sku)

combined = [dict(colorString=color, skus=sku_dict.get(color_id)) for color_id, color in colorStrings]

1
好的,这非常完美 - 现在要弄清楚为什么它有效 :) - Mike Christensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接