Python: сортировка списка с использованием другого порядка списков, различной длины и без «сортировки» - PullRequest
2 голосов
/ 03 сентября 2010

Я объясню это правильно:Я нахожусь в среде, где я не могу использовать встроенные функции Python (например, 'sorted', 'set'), не могу объявлять методы, не могу создавать условия (если) и не могу создавать циклы,за исключением:

  • может вызывать методы (но только один раз, и сохранение возвращает в другую переменную

    foo python: item.sort (); переменная #foo принимаетзначение, которое item.sort () возвращает

    bar python: foo.index (x);

  • и может выполнять понимание списка

    [item['bla'] для элемента в foo]

... что я не думаю, что поможет в этом вопросе

У меня есть список 'correct_order'со следующими значениями:

correct_order = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

и у меня есть список 'messed_order', со следующими значениями:

messed_order = [55, 1, 44, 3, 66, 5, 4, 7, 2, 9, 0, 10, 6, 8]

Что ж, мне нужно изменить порядок в списке 'messed_order', используяИндекс «правильного порядка» в качестве базового. Порядок остальных элементов, не включенных в правильный корректный порядок, не имеет значения.

Нечто подобное решило бы (опять же, за исключением того, что я не могу использовать циклы):

for item in correct_order:
    messed_order[messed_order.index(item)], messed_order[correct_order.index(item)] = messed_order[correct_order.index(item)], messed_order[messed_order.index(item)]

И в результате я получу «заказанный список»:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 55, 66, 44]

Итак, как я могу это сделать?

Для тех, кто знает zope / plone, я 'm на странице обложки (.pt), у которой нет вспомогательного скрипта Python (что, я думаю, невозможно для страниц обложки, только для страниц браузера).Если да, покажи как и я это сделаю).

Ответы [ 5 ]

5 голосов
/ 03 сентября 2010

Трудно ответить, не зная точно, что разрешено, а что нет. Но как насчет этого решения O (N ^ 2)?

[x for x in correct_order if x in messed_order] + [x for x in messed_order if x not in correct_order]
2 голосов
/ 04 марта 2011

Создайте Script (Python) объект в вашем скине и используйте его как функцию.Выражения TALES ограничены по определенной причине: они предназначены только для того, чтобы помочь вам создать разметку HTML или XML, а не выполнять полномасштабную бизнес-логику.Более того, создайте правильное представление браузера и избегайте жестких ограничений, накладываемых на редактируемый код через Интернет.

Кроме того, вы искажаете или неправильно понимаете СКАЗКИ.Вы можете использовать встроенные методы, такие как сортировка и установка.И вместо if вы можете использовать test (condition, iftrue, iffalse) или старый добрый condition and iftrue or iffalse с ограничением, что результат iftrue сам должен оценивать как true.

Еще лучше, выможет получить доступ к ограниченному набору модулей Python через словарь modules, например modules['string'].Вам нужно будет сделать дополнительные декларации безопасности в модуле Python файловой системы, чтобы расширить это.

См. раздел выражений Python TALES документации TAL.Обратите внимание, что список встроенных модулей, доступных для TALES, перечисленных там, с тех пор был расширен для охвата более новых версий Python.

0 голосов
/ 04 марта 2011

Не отвлекайте от ответов, которые уже даны, но это питон - вы не произвольно ограничены в использовании циклов:

for item in correct_order: messed_order[messed_order.index(item)], messed_order[correct_order.index(item)] = messed_order[correct_order.index(item)], messed_order[messed_order.index(item)]

так же верно, как поставить цикл в две строки.

В качестве альтернативы, это Zope - если вы не можете сделать это в одном выражении «python:», да, вы можете использовать вспомогательный скрипт. Сценарии находятся при приобретении, поэтому шаблон содержит что-то вроде:

<tag tal:define="abc context/script">

будет искать либо атрибут 'script' текущего объекта ( context ) [который может быть методом или свойством], либо "Script (Python)" объект с именем script в текущей папке или в любой папке предка! На самом деле, он даже не должен быть объектом сценария - хотя для вашей цели это должен быть какой-то объект, который возвращает список.

Далеко не от "Департамента произвольных ограничений", как выразилась Танатос, скорее, как будто не хватает ограничений!

0 голосов
/ 03 сентября 2010

Вот тот, который уничтожает messed_order

[messed_order.remove(i) or i for i in correct_order if i in messed_order] + messed_order

Этот сортирует messed_order на месте

messed_order.sort(key=(correct_order+messed_order).index)
0 голосов
/ 03 сентября 2010

Имеет ли значение точный порядок пунктов 55/66/44, или они просто должны быть перечислены в конце?Если заказ не имеет значения, вы можете сделать это:

[i for i in correct_order if i in messed_order] +
    list(set(messed_order) - set(correct_order))
...