2

この権利について説明し
ます。Pythonの組み込み関数(「sorted」、「set」など)を使用できず、メソッドを宣言できず、条件を作成できない環境にいます(if) 、およびループを作成することはできません。ただし、次の場合を除きます。

  • メソッドを呼び出すことができます(ただし、毎回1つだけで、保存すると別の変数に戻ります)

    foo python:item.sort(); #foo変数は、item.sort()が返す値を取ります

    バーpython:foo.index(x);

  • リスト内包表記を行うことができます

    [fooのアイテムのitem['bla']]

...それがこの質問に役立つとは思わないこと

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

さて、ベースとして「correct_order」のインデックスを使用して、「messed_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を知っている人のために、私はヘルパーpythonスクリプトがないスキンページ(.pt)にいます(スキンページでは不可能で、ブラウザーページでのみ可能だと思います。もしそうなら、方法を教えてください。そうします)。

4

5 に答える 5

5

何が許可され、何が許可されていないかを正確に知らず、答えるのは難しいです。しかし、この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]
于 2010-09-03T05:46:08.343 に答える
2

Script (Python)スキンにオブジェクトを作成し、それを関数として使用します。TALES式は、次の理由で制限されています。これらは、HTMLまたはXMLマークアップの作成を支援するためだけにあり、本格的なビジネスロジックを実行するためのものではありません。さらに良いことに、適切なブラウザビューを作成し、Through-The-Web編集可能コードに課せられる厳しい制限を回避します。

また、あなたは物語を誤って伝えたり誤解したりしています。sortやsetなどの組み込みメソッドを使用できます。また、代わりにiftest(condition、iftrue、iffalse)または古き良きものを使用できますが、結果自体がtrueと評価される必要condition and iftrue or iffalseがあるという制限があります。iftrue

さらに良いことに、modules辞書を介して、のような限られたPythonモジュールのセットにアクセスできますmodules['string']。ただし、これを拡張するには、ファイルシステムのPythonモジュールで追加のセキュリティ宣言を行う必要があります。

TALドキュメントのPythonTALES式のセクションを参照してください。そこにリストされているTALESにアクセスできる組み込みのリストは、新しいpythonバージョンをカバーするように拡張されていることに注意してください。

于 2011-03-04T08:48:52.103 に答える
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)]

ループを2行に配置するのと同じくらい有効です。

または、これはZopeです。単一の「python:」式で実行できない場合は、ヘルパースクリプトを使用できます。スクリプトは取得によって検出されるため、次のようなテンプレートが含まれています。

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

現在のオブジェクト(コンテキスト)の属性'script' [メソッドまたはプロパティである可能性があります]、または現在のフォルダーまたは任意の祖先フォルダー内のscriptという名前の「Script(Python)」オブジェクトのいずれかを検索します。実際、スクリプトオブジェクトである必要はありませんが、目的のためには、リストを返すオブジェクトである必要があります。

タナトスが言う「恣意的制限の部門」からはほど遠い、それは十分な制限がないかのようです!

于 2011-03-04T02:21:37.797 に答える
0

55/66/44アイテムの正確な順序は重要ですか、それとも最後にリストする必要がありますか?順序が重要でない場合は、次のようにすることができます。

[i for i in correct_order if i in messed_order] +
    list(set(messed_order) - set(correct_order))
于 2010-09-03T05:48:20.480 に答える
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)
于 2010-09-03T11:54:30.810 に答える