当前位置: 首页 > 面试题库 >

使用list.count使用.sort()就地对列表进行排序不起作用。为什么?

司寇阳朔
2023-03-14
问题内容

我试图按其元素的频率对列表进行排序。

>>> a = [5, 5, 4, 4, 4, 1, 2, 2]
>>> a.sort(key = a.count)
>>> a
[5, 5, 4, 4, 4, 1, 2, 2]

a不变。然而:

>>> sorted(a, key = a.count)
[1, 5, 5, 2, 2, 4, 4, 4]

为什么这种方法不起作用.sort()


问题答案:

您看到的是的某些 CPython实现细节 的结果list.sort。再试一次,但是先创建一个副本a

a.sort(key=a.copy().count)
a
# [1, 5, 5, 2, 2, 4, 4, 4]

.sort
a内部进行修改,因此a.count将产生无法预测的结果。
这被记录为实现细节。

什么copy电话确实是它创建的副本a用途和 列表的count的关键方法。您可以看到一些调试语句会发生什么:

def count(x):
    print(a)
    return a.count(x)

a.sort(key=count)
[]
[]
[]
...

a在内部访问时会显示为空列表.sort,并且[].count(anything)将是0。这解释了为什么输出与输入相同-谓词都相同(0)。

OTOH,sorted创建一个新列表,因此它没有此问题。

如果您真的想按频率计数排序,惯用的方法是使用Counter

from collections import Counter

a.sort(key=Counter(a).get)
a
# [1, 5, 5, 2, 2, 4, 4, 4]


 类似资料:
  • 我的方法应该按字母顺序排序所有对象的姓氏,这些对象包含在一个arraylist中 Rubrica类 主要的 谢谢你的帮助。

  • 问题内容: 我有一组三个列表项,它们希望在页面加载时从高到低自动显示。理想情况下使用jquery或javascript。 每个列表项都需要有自己的ID,因为它们每个都有各自的背景图像。数字必须是文本节点,以便用户可以编辑它们。 问题答案: 这可能是最快的方法,因为它不使用jQuery: 像下面这样调用函数: 您可以以相同的方式对其他列表进行排序,如果列表类在同一页面上还有其他元素,则应给您的ul一

  • 当添加到JTable(包含表单元格中不同的JCombo Box)中的排序器/autoRowSorter用列标题排序时,Jcomo Box不会用相应的行排序。 单击JCombo框可以更改它在显示组合框的模型值而不是视图值(与行相关的值)中结束的数据。 在互联网上找到的例子,用同样的方法来说明问题。我刚刚添加了setAutoCreateRowSorter(真) 代码参考: 如何在Swing中的JTab

  • 我有一个这样的方法: 此方法需要以如下字符串形式返回3个最昂贵项目的产品ID:“item1,item2,item3”。我应该只能使用溪流,我被困在这里了。我应该能够按值对项目进行排序,然后获得产品ID,但我似乎无法使其正常工作。 编辑: 产品ID位于入口类中

  • 问题内容: 我有兴趣对流中的列表进行排序。这是我正在使用的代码: 我想念什么吗?列表未排序。 它应该根据具有最低值的项目对列表进行排序。 以及打印方法: 问题答案: 这与对参数引用进行排序的地方不同。在这种情况下,您将得到一个排序后的流,最终需要将其收集并分配给另一个变量: 您只是错过了分配结果

  • 本文向大家介绍如何使用JavaScript对HTML列表进行排序?,包括了如何使用JavaScript对HTML列表进行排序?的使用技巧和注意事项,需要的朋友参考一下 要使用JavaScript对HTML列表进行排序,代码如下- 示例 输出结果 上面的代码将产生以下输出- 在点击“点击排序”按钮-