python - 为什么排序列表检测在这种情况下不起作用?

标签 python list sorting ipython

我的目标是让 python 代码能够检测列表是否已排序。

我想了解为什么以下代码返回 True 而不是我预期的猜测 False

l = [1, 2, 3, 4, 1, 6, 7, 8, 7]
all(l[i] <= l[i+1] for i in xrange(len(l)-1)) # return "True"

注释:

  • 我在 iPython 0.10 中使用 python 2.6.4
  • 我使用了非常大的列表,所以我宁愿避免 l == l.sort() 类型的解决方案

为了理解这一点,我已经阅读(并测试)了以下两篇主要文章中的信息:

编辑: 好吧,显然这个问题只出现在 iPython 内部,而不是仅使用 python 命令行时!

iPython 0.10

In [93]: l = [1, 2, 3, 4, 1, 6, 7, 8, 7]

In [94]: all(l[i] <= l[i+1] for i in xrange(len(l)-1))
Out[94]: True

python 2.6.4

>>> l = [1, 2, 3, 4, 1, 6, 7, 8, 7]
>>> all(l[i] <= l[i+1] for i in xrange(len(l)-1))
False

最佳答案

我能够在我的机器上重现类似的问题。然而,经过挖掘,发现 all 函数不是内置函数,而是来自 numpy (all.__module__ == 'numpy.core.fromnumeric') .

问题是您正在创建一个生成器而不是一个列表。例如:

all(x>5 for x in xrange(3))
# <generator object <genexpr> at 0x1153bf7d0>

all([x>5 for x in xrange(3)])
# False

if all(x>5 for x in xrange(3)):
   print True
else:
   print False
# prints True

if all([x>5 for x in xrange(3)]):
   print True
else:
   print False
# prints False

只需将 [...] 添加到您的表达式中即可:

all([l[i] <= l[i+1] for i in xrange(len(l)-1)])
# False

如果您需要创建一个列表,更有效的解决方案是执行一个简单的 for 循环:

for i in xrange(len(l)-1):
    if l[i] > l[i+1]:
        result = False
        break
else:
    result = True

如果像我一样,您覆盖了内置的 all 函数,您可以执行 del all 来恢复它。之后,您应该拥有 all.__module__ == '__builtin__'。如果情况仍然不是这样,只需执行 all = __builtin__.all

关于python - 为什么排序列表检测在这种情况下不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30326927/

相关文章:

list - 如何在 Dart/Flutter 中拆分列表

python - 检查嵌套列表是否在特定索引处具有和不具有值的优雅方法是什么?

c++ - 如何生成用于测试快速排序最佳案例的数组?

r - 根据月-年时间格式对数据框进行排序

python - Numpy中的线段相交算法

python - 如何使用 pandas 中的 apply 函数返回多行?

python - 如何将范围映射转换为字典

python - Django 和 Django CMS 错误

jQuery 树遍历 - 将无序列表元素嵌套到 JSON

android - 使用android在sqlite中自然排序字母数字值