按子列表长度排序列表
我正在尝试按照每个列表的长度来排序一个列表中的列表。但是我遇到了一个奇怪的语法错误。我是Python新手,所以可能做错了什么。
相关的代码部分:
orderedpaths=[]
if(len(paths)==1):
orderedpaths=paths
else:
c=0
while(len(paths)!=0):
if(c==0):
smallest=(len(paths[c])
c+=1
else:
if(len[paths[c])<smallest):
smallest=(len(paths[c]))
orderedpaths.append(paths[c])
del paths[c]
c+=1
return orderedpaths
我遇到的错误是:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.py", line 153
c+=1
^
SyntaxError: invalid syntax
我完全不知道为什么会这样。
3 个回答
-1
你也可以使用这段很不错的代码 :) :
>>> a = [[1,2,3], [1,2,3,4], [1,2]]
>>> b = sorted(a, lambda x,y: 1 if len(x)>len(y) else -1 if len(x)<len(y) else 0)
>>> print b
[[1, 2], [1, 2, 3], [1, 2, 3, 4]]
如果你想要不同的排序顺序,可以把1和-1互换一下。
正如评论者所提到的,这段代码只在python 2.x版本中有效。还有一些更好看的代码可以在python 3.x版本中使用:
>>> a = [[1,2,3], [1,2,3,4], [1,2]]
>>> b = sorted(a, key = len)
>>> print b
[[1, 2], [1, 2, 3], [1, 2, 3, 4]]
2
正如eumiro的回答中提到的,使用sorted()是个不错的选择。
需要注意的是,sorted()
(还有list.sort(key=..)
)是在Python 2.4版本中才引入的。如果你使用的是低于2.4的版本,可以自己写一个类似的功能。下面是一个简单的例子:
import inspect
def my_sorted(in_list, key=lambda x:x):
# basic error checking
if not is_instance(in_list, list):
raise ValueError("expecting 1st argument to be a list")
if not inspect.isroutine(key):
raise ValueError("key must be a function/method")
# convert to [ (key(item1), item1), .... ]
key_map = map(lambda x: (key(x),x), in_list)
# standard sort, while effectively sort by key(item)
key_map.sort()
# convert back original format and return
return [x for _,x in key_map]
你可以这样使用它:
orderedpaths = my_sorted(paths, key=len)
22
你的问题出在以下代码中的括号数量:
smallest=(len(paths[c])
还有在:
if(len[paths[c])<smallest):
以及在:
if(len[paths[c])<smallest):
如果你想根据路径的长度进行排序,可以试试这个:
orderedpaths = sorted(paths, key=len)
这里是关于 sorted
的文档。