我有一个嵌套子列表的列表,其结构如下
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
做一个
唯一列表
包含子列表的
“标题”
/
姓名
每个项目一个+正确顺序的值。
因此,信息被保存在不同的数据结构中。
我想达到这个目标
:
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,但没有成功。
更新
这是我的完整代码。
def get_names(a):
return reduce(lambda ac, v: ac + [v[0]] if v[0] not in ac else ac, a, [])[1:]
def collect_all_data(_data):
all_names = set(reduce(lambda x,y: x+y, map(get_names, _data)))
unique_names = list(map(lambda x: [x], all_names))
agg = list(map(lambda x:[x], unique_names))
agg = [['names']] + unique_names
for team_i, team_data in enumerate(_data):
team = ""
for i, skill_val in enumerate(team_data):
if i==0:
team = skill_val[1]
agg[0].append(team)
continue
else :
for i_us,us in enumerate(unique_names):
if us[0] == skill_val[0]:
agg[i_us+1].append(skill_val[1])
print("\--->{} type:{}".format(agg, type(agg)))
return agg
collect_all_data(in_data)
它产生输出:
注意
:的
秩序
子列表的
不重要,除非
这个
第一个
['name', ' name_1', ' name_2', 'name_3']
这应该是第一次。
[
['names', 'name_1', 'name_2', 'name_3'],
['item_D', '4'],
['item_B', '2', '5', '6'],
['item_C', '3', '7'],
['item_A', '2']
]
代码太长,但它没有添加
'-'
当物品没有价值的时候。
会是简单的方法吗?