我的目标是让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"
注意:
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
答案 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)
您在问题中提供的代码运作良好:
>>> l = [1, 2, 3, 4, 1, 6, 7, 8, 7]
>>> all(l[i] <= l[i+1] for i in xrange(len(l)-1))
False
我们将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
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
修改强> 或者更好:使用接受答案中提供的循环!