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

时间:2015-05-19 13:24:00

标签: 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

3 个答案:

答案 0 :(得分:1)

我能够在我的机器上重现类似的问题。但是,在挖掘之后,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

答案 1 :(得分:0)

您在问题中提供的代码运作良好:

Python 2.7

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

Python 3.4

我们将range替换为xrange ...

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

使用Python 2.7.6的IPython 3.0.0

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

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

答案 2 :(得分:0)

最后看来iPython 0.10中的工作解决方案是:

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

修改 或者更好:使用接受答案中提供的循环!