【问题标题】:Incorect output using itertools.groupby使用 itertools.groupby 的输出不正确
【发布时间】:2019-09-13 17:38:42
【问题描述】:

我收到了这个家庭作业问题,在参加了 Udemy 课程后,我仍然无法弄清楚如何获得像解决方案这样的正确输出。

此外:我怎样才能提高效率。我如何在不使用显式循环的情况下做到这一点,而是使用列表/字典推导。

这就是我的工作:

def group_permutation_values(permutations_list): 

    dic = {}
    f = lambda x: x[1]
    for key, group in itertools.groupby(sorted(permutations_list, key=f), f):
        dic[key] = list(group)

    return dic

    pass

results = [
    ((1, 2, 3), -4),
    ((1, 3, 2), -4),
    ((2, 1, 3), -2),
    ((2, 3, 1), -2),
    ((3, 1, 2), 0), 
    ((3, 2, 1), 0)
]
print(group_permutation_values(results))

这是我得到的:

{
    -4: [((1, 2, 3), -4), ((1, 3, 2), -4)],
    -2: [((2, 1, 3), -2), ((2, 3, 1), -2)],
     0: [((3, 1, 2), 0), ((3, 2, 1), 0)]
}

以及预期的输出:

{
    -4: [(1, 2, 3), (1, 3, 2)],
    -2: [(2, 1, 3), (2, 3, 1)],
     0: [(3, 1, 2), (3, 2, 1)]
}

【问题讨论】:

  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 3.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?

标签: python group-by itertools


【解决方案1】:

groupby 的键函数只决定了值如何分组;该函数不用于更改组元素本身。仅仅因为您按element[1] 分组,并不意味着这些组将只包含element[0],您会得到整个元组。

您需要做的就是在创建列表值时从组的每个元素中提取第一个嵌套元组:

dic[key] = [t[0] for t in group]

所以在list(group) 返回[((1, 2, 3), -4), ((1, 3, 2), -4)] 的地方,上面的列表推导改为生成[(1, 2, 3), (1, 3, 2)]

您可以用字典理解替换外部 for 循环从 groupby 结果构建字典:

def group_permutation_values(permutations_list): 
    f = lambda x: x[1]
    sorted_list = sorted(permutations_list, key=f)
    return {k: [t[0] for t in g] for k, g in itertools.groupby(sorted_list, f)}

然而,在这里使用groupby() 是错误的工具。 groupby() 要求您首先对输入进行排序,这会降低性能。排序是一个 O(N log N) 操作,但是将元组存储到字典中可以改为在 O(N) 线性时间内完成,只需遍历输入列表并附加到每个条目的列表:

def group_permutation_values(permutations_list):
    grouped = {}
    for a, b in permutations_list:
        grouped.setdefault(b, []).append(a)
    return grouped

这不能转化为字典理解,但仍然更有效。理解不是灵丹妙药,它们只是一种通过处理可迭代对象中的每个元素来创建容器(列表、字典、集合)的语法。是的,它们比等效的 for-loop-with-add-to-container-operation 更高效一些,但它们仍然受制于通常的算法时间复杂度。

【讨论】:

    猜你喜欢
    • 2011-12-28
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多