如果我有字典中的值列表,我可以在这些值列表上执行条件拉链吗?

时间:2018-06-15 05:02:21

标签: python python-3.x dictionary

我创建了以下词典:

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]}

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)