2010-09-03 2 views
2

Я объясню это право:
Я в среде, где я не могу использовать встроенные функции python (например, «рассортированные», «набор»), не может объявить методы, не может сделать условие (если), и не может сделать петлю, за исключением:Python: Сортировка списка с использованием другого порядка списка, с разной длиной и без сортировки

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

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

    bar python: foo.index (x);

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

    [пункт [ 'л'] для пункта в 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», используя индекс «correct_order» в качестве основания. Порядок остальных элементов, не включенных в correct_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)] 

И будет результат на 'ordered_list', что я хочу:

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

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

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

+0

Вы находитесь в одной бесполезно разбитой среде. –

+9

Вы работаете в Департаменте произвольных ограничений? – Thanatos

+0

@Thanatos Нет, в этом конкретном случае я ограничусь использованием нескольких артефактов. В «всевозможной среде» я просто закончил бы это решение «для», на которое я поставил вопрос. –

ответ

4

Трудно ответить, не зная точно, что разрешено, а что нет. Но как насчет этого решения 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] 
+0

Я согласен с этим, поскольку, как я думаю, кто-то отправляет другое решение со сниженной стоимостью. В моем списке нет слишком много предметов, поэтому я думаю, что с этим все в порядке. Но я продолжаю искать лучшие решения. –

0

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

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

Я забыл упомянуть, не имеет значения.Я просто поставлю решение Павла, как он ответил ранее (не сердитесь на меня). –

+0

Это решение недействительно, поскольку встроенные функции python не разрешены. –

0

Вот один, который разрушает 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

Не умаляет из уже полученных ответов, но это python - вы не произвольно ограниченный использованием петель:

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 (Python)» с именем сценарий в текущей папке или в любой папке предка! На самом деле, он даже не должен быть объектом сценария, хотя для вашей цели он должен быть каким-то объектом, который возвращает список.

Вдали от «Департамента произвольных ограничений», как выразился Танатос, это похоже на то, что ограничений недостаточно!

2

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

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

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

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

+0

Благодарим вас за комментарий. Я посмотрю документы и узнаю больше о TALES. –

Смежные вопросы