python - 嵌套列表结构中的聚合数据

python - aggregate data in nested list structure

我有一个具有以下结构的嵌套子列表的列表

in_data = 
 [
   [
     ['name', 'name_1'],  
     ['item_B', '2'], 
     ['item_C', '3'], 
     ['item_D', '4']
   ],
   [
     ['name', 'name_2'], 
     ['item_B', '5'], 
     ['item_A', '2']
   ],
   [
     ['name', 'name_3'], 
     ['item_B', '6'], 
     ['item_C', '7']
   ]
]

我正在尝试收集 in_data 中的所有数据并制作一个包含子列表的 唯一列表 ,一个用于所有 "headers"/ names 并且每个项目一个 + 正确顺序的值。 所以信息被保留,但在不同的数据结构中。

我要实现这个列表:

res_list = 
[
  ['name', ' name_1', ' name_2', 'name_3'], 
  ['item_B', '2', '5', '6'], 
  ['item_C', '3','-', '7'], 
  ['item_D', '4','-', '-'], 
  ['item_A', '-','2', '-'] 
]

我正在尝试以最pythonic 的方式来做。我尝试了 for 循环和 map() + lambda 但没有成功。

会是简单的方法吗?

您可以使用 collections.defaultdict:

import collections
in_data = [[['name', 'name_1'], ['item_B', '2'], ['item_C', '3'], ['item_D', '4']], [['Skill', 'name_2'], ['item_B', '5'], ['item_A', '2']], [['Skill', 'name_3'], ['item_B', '6'], ['item_C', '7']]]
d = [list(zip(['name', *b[0][1:]], i)) for b in in_data for i in b[1:]]
new_d = collections.defaultdict(dict)
for i in d:
   new_d[dict(i)['name']][i[-1][0]] = i[-1][-1]

all_names = list({i for b in new_d.values() for i in b})[::-1]
result = [['name', *all_names], *[[a, *[b.get(k, '-') for k in all_names]] for a, b in new_d.items()]]

输出:

[['name', 'name_1', 'name_2', 'name_3'], 
 ['item_B', '2', '5', '6'], 
 ['item_C', '3', '-', '7'], 
 ['item_D', '4', '-', '-'], 
 ['item_A', '-', '2', '-']]

优化方法(由复合字典键 (<skill name>, <column name>)dict.get 方法提供支持):

header = ['names']
names = set()
d = {}

for lst in in_data:
    col_name = lst[0][-1]
    header.append(col_name)
    for name, val in lst[1:]:
        names.add(name)
        d[name, col_name] = val

res = [[n, *[d.get((n, h), '-') for h in header[1:]]] for n in names]
res.insert(0, header)
print(res)

输出:

[['names', 'name_1', 'name_2', 'name_3'],
 ['item_C', '3', '-', '7'],
 ['item_D', '4', '-', '-'],
 ['item_B', '2', '5', '6'],
 ['item_A', '-', '2', '-']]