我创建了以下词典:
dct = {'T': [[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 1, 0]], 'B': [[0, 1, 0, 0, 0], [0, 0, 0, 0, 1]], 'J': [[0, 0, 1, 0, 0], [0, 0, 0, 0, 1]], 'K': [0, 0, 0, 0, 1]}
请注意,每个值都是单个列表或多个列表。我想弄清楚我是否可以在每个键的值列表上做一个条件拉链(或者一些替代解决方案,它给我我想要的输出)。条件是如果连续值列表上的1s在彼此相距2个索引值的距离内,我只希望值列表压缩给定键。
我想从这个输入字典输出的最终输出应该如下所示:
zp_dict = {'T': [2, 1, 0, 1, 0], 'B': [[0, 1, 0, 0, 0], [0, 1, 0, 0, 0]], 'J': [0, 0, 1, 0, 1], 'K': [0, 0, 0, 0, 1]}
请注意' T'的值列表和' J'应该压缩在一起,因为非零值不超过2个索引,但值列表为' B'应该保持分开,因为非零值是3个指数,并且' K'值列表应该保持不变。
为了说明我尝试做的事情,请考虑以下几乎完成我想做的事情的代码,但没有条件:
zp_dict = {}
for k, v in dct.items():
zp_dict[k] = [sum(x) for x in zip(*v)]
这产生了以下新的字典,这对于密钥' B'是错误的:
zp_dict = { 'T': [2, 1, 0, 1, 0], 'B': [0, 1, 0, 0, 1], 'J': [0, 0, 1, 0, 1], 'K': [0, 0, 0, 0, 1]}
答案 0 :(得分:1)
这从技术上实现了您所要求的结果。但是,我假设您希望将所有内容添加到一起,如果至少有两个列表的数字在彼此的2个索引中。例如,[[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 1]]
会导致[1, 1, 0, 0, 1]
NOT [[1, 1, 0, 0, 0], [0, 0, 0, 0, 1]]
,尽管最后一个列表的数量远远超过任何其他列表的2个索引。
代码将列表汇总在一起,然后找出前2个非零数字相隔多远。如果它们相距<= 2个索引,那么总计列表将添加到zp_dict
,否则列表列表(v
)保持不变,并添加到zp_dict
代码在per the docs上,如果你想修补它
注意:我认为您提供的'K'
中的dct
有一个拼写错误,因为它应该是列表中的列表(与其他列表一样) - 如果没有,sum(x) for x in zip(*v)
会破裂。如果没有,则修复不需要太多 - 只需验证v
中的列表数量。
dct = {
'T': [[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 1, 0]],
'B': [[0, 1, 0, 0, 0], [0, 0, 0, 0, 1]],
'J': [[0, 0, 1, 0, 0], [0, 0, 0, 0, 1]],
'K': [[0, 0, 0, 0, 1]]
}
zp_dict = {}
for k, v in dct.items():
sum_list = [sum(x) for x in zip(*v)]
first_non_zero = next((i for i, n in enumerate(sum_list) if n), 0)
second_non_zero = next((i for i, n in enumerate(sum_list[first_non_zero+1:]) if n), 0)
zp_dict[k] = sum_list if second_non_zero < 2 else v
print(zp_dict)
>>{'T': [2, 1, 0, 1, 0], 'B': [[0, 1, 0, 0, 0], [0, 0, 0, 0, 1]], 'J': [0, 0, 1, 0, 1], 'K',: [0, 0, 0, 0, 1]}
修改强> 您还可以添加if语句(带内联函数),如果这是您要查找的内容。
zp_dict[k] = [sum(x) for x in zip(*v) if conditionTest(v)]
如果conditionTest
返回True
,它会将列表添加到一起。虽然如果你没有添加函数,我会清理它,只需将for循环添加到函数中:
zp_dict[k] = sumFunction(v)