按子列表长度排序列表

1 投票
3 回答
8690 浏览
提问于 2025-04-16 10:14

我正在尝试按照每个列表的长度来排序一个列表中的列表。但是我遇到了一个奇怪的语法错误。我是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 的文档。

撰写回答