【问题标题】:if I have lists for the values in a dictionary, can I perform a conditional zip on these value lists?如果我有字典中的值列表,我可以对这些值列表执行条件压缩吗?
【发布时间】:2018-06-15 05:02:21
【问题描述】:

我创建了以下字典:

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

请注意,每个值要么是单个列表,要么是多个列表。我试图弄清楚我是否可以对每个键的值列表进行条件压缩(或一些替代解决方案,它可以提供我想要的输出)。条件是,如果连续值列表上的 1 在彼此之间的 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]}

【问题讨论】:

  • 我认为没有必要投反对票......他显然已经做出了努力......只是他没有以我能理解的任何方式解释标准

标签: python python-3.x dictionary


【解决方案1】:

这在技术上实现了您所要求的结果。但是,如果至少 2 个列表的数字在彼此的 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 个非零数字相距多远。如果它们相隔 zp_dict,否则列表列表 (v) 保持不变,并添加到 zp_dict

代码在OnlineGDB,如果你想修改它

注意:我假设您提供的 dct 中的 'K' 有错字,因为它应该是列表中的列表(与其他列表一样) - 如果不是,@ 987654330@ 会中断。如果不是,则不需要太多修复 - 只需验证 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2016-04-15
    • 2021-06-02
    相关资源
    最近更新 更多