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

Python 为什么排序列表检测在这种情况下不起作用?,python,list,sorting,ipython,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" python 2.6.4 >>> l = [1, 2, 3, 4, 1, 6, 7, 8, 7] >>> all(l[i] <= l[i+1]

我的目标是让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"
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
l=[1,2,3,4,1,6,7,8,7]
>>>all(l[i]我能够在我的机器上重现一个类似的问题。但是,挖掘之后,出现了
all
函数不是内置函数,而是来自numpy(
all.\uu module\uuu=='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
如果需要创建列表,则更有效的解决方案是执行简单的for循环:

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

如果像我一样,你重写了内置的
all
函数,你可以执行
del all
来恢复它。之后,你应该拥有
all.\uu模块.\uuuuuuu内置的。如果情况仍然不是这样,只需执行
all=\uuuuuuuuuu内置的.all
你在问题中给出的代码工作正常:

Python 2.7 IPython 3.0.0和Python 2.7.6 [1]中的
l=[1,2,3,4,1,6,7,8,7]

在[2]:all(l[i]中,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
[93]中的
l=[1,2,3,4,1,6,7,8,7]

In[100]:全部([l[i]@Ajay:你能说得更具体一点吗?我在Python2.6.6上也得到了错误,包括gen-exp版本和list-comp版本。我在Python2.5.5上得到了相同的结果。这可能只是吹毛求疵,但你显示的代码既没有返回也没有打印任何内容。因此,如果你在REPL之外的任何地方运行这个,你应该看不到“对”或者其他任何东西。你100%确定这是正在运行的代码,这是正在生成输出的行吗?对我来说似乎是一个ipython bug。最新版本是3.1。我会尝试升级。什么是
打印所有内容。\uuu模块\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuumpy
。这不是问题-根本不需要创建
列表
-genexp非常好-您使用什么版本的python来获得此输出?@JulienSpronck:很可能您在ipython会话的早期运行了
from numpy import*
from numpy import all
。此解决方案浪费了时间通过创建一个额外的列表来考虑它的内存。考虑把它变成一个循环,一旦任何条件被破坏,它就会中断。JulysPrimk:更大的问题是你和PoDEV仍然在观察不同的行为。这个解决方案通过创建一个额外的列表来浪费内存。考虑把它变成一个循环,一旦任何条件被破坏,它就会中断。“音乐你完全正确:”Julien Spronck提出的循环确实是一个更好的解决我的情况的方法(旧IPython)。
for i in xrange(len(l)-1):
    if l[i] > l[i+1]:
        result = False
        break
else:
    result = True
>>> l = [1, 2, 3, 4, 1, 6, 7, 8, 7]
>>> all(l[i] <= l[i+1] for i in xrange(len(l)-1))
False
>>> l = [1, 2, 3, 4, 1, 6, 7, 8, 7]
>>> all(l[i] <= l[i+1] for i in range(len(l)-1))
False
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
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