Упорядочение списка списков по спискам len - PullRequest
1 голос
/ 19 января 2011

Я пытаюсь упорядочить список списков размером len.Но я получаю странную синтаксическую ошибку.Я новичок в 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 ]

22 голосов
/ 19 января 2011

Ваша проблема заключалась в количестве скобок в:

smallest=(len(paths[c])

и в:

if(len[paths[c])<smallest):

, а также в:

if(len[paths[c])<smallest):

Чтобы отсортировать пути по их длине, вы можете попробовать это:

orderedpaths = sorted(paths, key=len)

Вот документация для sorted.

2 голосов
/ 19 января 2011

Как указано в ответ eumiro с использованием sorted () - это путь.

Обратите внимание, что sorted() (а также list.sort(key=..)) былотолько введено в Python 2.4.Если вы находитесь в моей лодке и должны иметь дело с <2.4, вы можете создать свою собственную версию.Грубый пример: </p>

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)
0 голосов
/ 19 января 2011

Вы также можете использовать этот красивый кусок кода :):

>>> 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, если вы хотите другой порядок сортировки.

Как замечают комментаторы, этот код работает тольков питоне 2.х.Есть немного более красивый код, который работает и в 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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...