2

我将正确解释这一点:
我处于无法使用python内置函数(如'sorted','set'),无法声明方法,无法创建条件的环境中(如果) , 并且不能循环,除了:

  • 可以调用方法(但每次只调用一个,并将返回值保存在另一个变量上

    foo python:item.sort(); #foo 变量采用 item.sort() 返回的值

    酒吧 python:foo.index(x);

  • 并且可以做列表理解

    [项目 ['bla'] 用于 foo 中的项目]

...我认为这对这个问题没有帮助

我有一个“正确订单”列表,其中包含以下值:

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 脚本(我认为皮肤页面不可能,只适用于浏览器页面。如果是,告诉我怎么做,我会做的)。

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 标记,而不是执行完整的业务逻辑。更好的是,创建一个适当的浏览器视图并避免对通过 Web 可编辑代码施加的严格限制。

此外,您在歪曲或误解 TALES。您可以使用内置方法,例如 sorted 和 set。而不是if你可以使用 test(condition, iftrue, iffalse) 或一个很好的旧condition and iftrue or iffalse的,但其结果iftrue必须本身评估为真。

更好的是,您可以通过modules字典访问一组有限的 Python 模块,例如modules['string']. 您需要在文件系统 python 模块中进行额外的安全声明来扩展它。

请参阅 TAL 文档的Python TALES 表达式部分。请注意,此处列出的 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)]

与将循环放在两行一样有效。

或者,这是 Zope - 如果您不能在单个“python:”表达式中执行此操作,是的,您可以使用帮助脚本。脚本是通过获取找到的,因此模板包含以下内容:

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

将在当前文件夹或任何祖先文件夹中查找当前对象(context)的属性“脚本”[可以是方法或属性],或名为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 回答