我有一个带有嵌套子列表的列表,具有以下结构
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
中的所有数据,并创建一个包含子列表的唯一列表,其中包含所有“标头” / < em>名称,并为每个项目加上一个正确的值。
因此,信息被保留,但是处于不同的数据结构中。
我要获得此列表:
res_list =
[
['name', ' name_1', ' name_2', 'name_3'],
['item_B', '2', '5', '6'],
['item_C', '3','-', '7'],
['item_D', '4','-', '-'],
['item_A', '-','2', '-']
]
我正在尝试以最蟒蛇的方式做到这一点。我尝试了for循环,还尝试了map()+ lambda,但没有成功。
会是简单的方法吗?
答案 0 :(得分: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', '-']]
答案 1 :(得分:1)
您可以使用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', '-']]