2010-09-03 8 views
2

Je vais vous expliquer ce droit:
Je suis dans un environnement où je ne peux pas utiliser les fonctions intégrées de Python (comme « trié », « ensemble »), ne peut pas déclarer des méthodes, ne peut pas rendre les conditions (si), et ne peut pas faire des boucles, à l'exception:Python: Trier la liste en utilisant un autre ordre, ayant des longueurs différentes, et sans 'trié'

  • peut appeler des méthodes (mais juste un à chaque fois et l'enregistrement des retours sur une autre variable

    python foo: item.sort(); #foo variable prend la valeur item.sort() retourne

    bar python: foo.index (x);

  • et peut faire comprendre la liste

    [article [ 'bla'] pour objet foo]

... ce que je ne pense pas que cela aidera sur cette question

j'ai une liste 'correct_order', avec ces valeurs:

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

et j'ai li 'de messed_order' st, avec ces valeurs:

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

Eh bien, je dois réorganiser la liste 'messed_order', en utilisant l'indice de 'correct_order' comme base. L'ordre des autres éléments non inclus dans correct_order n'a pas d'importance.

Quelque chose comme cela résoudrait (encore une fois, sauf que je ne peux pas utiliser des boucles):

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)] 

Et entraînerait sur le 'ordered_list' que je veux:

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

Ainsi, Comment puis-je faire ceci? Pour ceux qui connaissent zope/plone, je suis sur une skin page (.pt), qui n'a pas de script python helper (ce que je pense que ce n'est pas possible pour les pages de skin, seulement pour les pages de navigateur. Si c'est le cas, montrez-moi comment et je le ferai).

+0

Vous êtes dans un environnement inutilement brisé. –

+9

Travaillez-vous pour le Département des restrictions arbitraires? – Thanatos

+0

@Thanatos Non, dans ce cas précis, je suis limité à utiliser quelques artefacts. Dans un «tout l'environnement possible», je finirais juste avec cette solution «pour» que j'ai mise sur la question. –

Répondre

4

Il est difficile de répondre, ne sachant pas exactement ce qui est autorisé et ce qui ne l'est pas. Mais qu'en est-il de cette solution 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

Je vais accepter cela, car je pense que n'importe qui publie une autre solution avec un coût réduit. Ma liste n'a pas trop d'articles, donc, je pense que je vais bien avec ça. Mais je continue de chercher de meilleures solutions. –

0

Est-ce que l'ordre exact des matières 55/66/44 articles, ou doivent-ils juste pour figurer à la fin?Si l'ordre n'a pas d'importance que vous pourriez faire ceci:

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

J'ai oublié de mentionner, n'a pas d'importance.Je vais juste mettre la solution de Paul comme il a répondu plus tôt (ne soyez pas en colère contre moi). –

+0

Cette solution n'est pas valide car les fonctions intégrées de python ne sont pas autorisées. –

0

Voici qui détruit messed_order

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

Celui-ci trie messed_order en place

messed_order.sort(key=(correct_order+messed_order).index) 
0

ne pas nuire à partir des réponses déjà données, mais c'est python - vous ne sont pas arbitrairement Restriction d'utilisation de boucles:

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)] 

est aussi valide que de placer la boucle sur deux lignes.

Alternativement, ceci est Zope - si vous ne pouvez pas le faire dans une seule expression "python:", oui, vous pouvez utiliser un script d'assistance. Les scripts sont trouvés par l'acquisition, donc un modèle contenant quelque chose comme:

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

vont rechercher un soit un attribut « script » de l'objet courant (contexte) [qui pourrait être une méthode ou une propriété] ou un objet "Script (Python)" nommé script dans le dossier actuel, ou dans n'importe quel dossier ancêtre! En fait, il n'a même pas besoin d'être un objet script - bien que pour votre but, il doit être un objet qui renvoie une liste. Loin du "Département des Restrictions Arbitraires", comme le dit Thanatos, c'est plutôt comme s'il n'y avait pas assez de restrictions!

2

Créez un objet Script (Python) dans votre peau et utilisez-le en tant que fonction. Les expressions de TALES sont limitées pour une raison: elles ne sont là que pour vous aider à créer du balisage HTML ou XML, pas pour une logique métier complète. Mieux encore, créez une vue de navigateur appropriée et évitez les restrictions sévères imposées sur le code éditable Through-The-Web.

En outre, vous faites une fausse déclaration ou une mauvaise compréhension des CONTES. Vous pouvez utiliser des méthodes intégrées comme triées et définies. Et au lieu de if vous pouvez utiliser test (condition, iftrue, iffalse) ou un bon vieux condition and iftrue or iffalse avec la limitation que le résultat de iftrue doit lui-même évaluer à vrai.

Encore mieux, vous pouvez accéder à un ensemble limité de modules Python via le dictionnaire modules, tel que modules['string']. Vous aurez besoin de faire des déclarations de sécurité supplémentaires dans un module python de système de fichiers pour étendre cela. Voir la Python TALES expression section de la documentation TAL. Notez que la liste des built-ins accessibles à TALES qui y sont listés a depuis été étendue pour couvrir les nouvelles versions de python.

+0

Merci pour le commentaire. Je vais regarder des docs, et en apprendre plus sur TALES. –

Questions connexes