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

排序过程中列表似乎为空[重复]

公冶伟
2023-03-14
问题内容

这个问题已经在这里有了答案

在排序时访问列表 (2个答案)

6年前关闭。

我想就地对列表进行排序,并尝试在排序过程中(key功能内)使用列表本身。我发现列表本身似乎是空的。

a = [1,4,5,3,2,6,0]
b = ['b', 'e', 'f', 'd', 'c', 'g', 'a']
b.sort(key=lambda x: a[b.index(x)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
ValueError: 'b' is not in list

所以我尝试了:

def f(x):
  print "FOO:", x, b
  return b.index(x)

b.sort(key=f)

并得到

FOO: b []
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in f
ValueError: 'b' is not in list

有什么解释吗?


问题答案:

listobject.c源代码:

/* The list is temporarily made empty, so that mutations performed
 * by comparison functions can't affect the slice of memory we're
 * sorting (allowing mutations during sorting is a core-dump
 * factory, since ob_item may change).
 */

并从Mutable Sequence
Types文档中

CPython实现细节 :在对列表进行排序时,尝试使列表变异甚至检查的效果是不确定的。Python
2.3及更高版本的C实现使列表在整个持续时间内都显示为空,并ValueError在可以检测到列表在排序过程中发生突变的情况下引发该列表。

您可以压缩ab改为:

b[:] = [bval for (aval, bval) in sorted(zip(a, b))]


 类似资料:
  • 我一直在玩Java 8 ,我决定对 和 流进行微基准测试。正如预期的那样, 的速度是原来的两倍,但还是出现了其他一些问题--如果我在将数据传递给 之前先对其进行排序,则与传递未排序列表相比, Map->Collect/code>得到结果所需的时间要多出5-8倍。 下面是一个更好的基准测试代码 结果也是相似的: 那么,我的问题是为什么过滤一个未排序的列表比过滤一个已排序的列表更快呢?

  • 我在学组装。我拆解了一个简单的C程序,并用GDB进行了调试。但我注意到的一件事是,值的移动非常频繁。 RDI的值在rbp-0x18(<+8>)处移动到堆栈,RSI的值在rbp-0x20(+12)处移动到堆栈。然后,rbp-0x18处的值被移动到rax(+16),该值将再次被移动到rdi(+20)。为什么要这样做?为什么不直接使用rdi,或者至少通过rax(<+16>)直接将rbp-0x18移动到r

  • 我有一个linkedhashmap的列表,我需要根据linkedhashmap的属性对列表进行排序。 这是我的LinkedHashMap; 我想根据“代码”属性对此列表进行排序。

  • 我对python还很陌生,我正在尝试创建21点。然而,当我试图打印出玩家的手牌时,我遇到了一些困难。 这是我的击球(抽牌)代码: 这是我打印卡片的代码: 我的代码所做的第一件事是为庄家和玩家抽两张牌,这运行得很好。然而,当玩家抽到一张牌后,它就会变得有点摇摆不定。输出如下所示: 当我抽到一张新牌时,这张牌不变,它保持我抽到的最后一张牌。然后,当我打印我的甲板,它打印我的旧甲板和我的新甲板。但是,分

  • 我正在尝试对一个数组进行排序,但是一个值应该优先于所有其他值,这意味着它应该总是出现在排序数组的末尾。 我试着到处玩,试图找到一个合适的排序函数,但偶然发现了我不理解的结果。 你可以看到我的排序函数,在这两种情况下都是完全一样的。根据我的理解,如果a大于B,它应该返回1。的固定返回值难道不应该使2成为“最大”数吗?它似乎对第一个数组起作用,但对第二个数组不起作用,因此结果取决于输入数组。我尝试了很