我将解释这一点:
我在一个不能使用python内置函数的环境中(比如'sorted','set'),不能声明方法,不能创建条件(if),也不能生成循环,除了:
可以调用方法(但每次只调用一个,并在另一个变量上保存返回
foo python:item.sort(); #foo变量获取item.sort()返回的值
bar python:foo.index(x);
可以做列表理解
[项目['bla'] for 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 :(得分: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]
答案 1 :(得分:2)
在皮肤中创建一个Script (Python)
对象,并将其用作函数。 TALES表达式的限制有一个原因:它们只是帮助您创建HTML或XML标记,而不是完整的业务逻辑。更好的是,创建一个合适的浏览器视图,避免严重限制通过Web编辑的代码。
此外,您是对TALES的歪曲或误解。您可以使用内置方法,例如sorted和set。而不是if
,您可以使用test(condition,iftrue,iffalse)或旧的condition and iftrue or iffalse
,但iftrue
的结果必须自己评估为true。
更好的是,您可以通过modules
字典访问一组有限的Python模块,例如modules['string']
。您需要在文件系统python模块中进行额外的安全声明,以扩展它。
请参阅TAL文档的Python TALES expression section。请注意,那里列出的TALES可访问的内置列表已经扩展到更新的python版本。
答案 2 :(得分:0)
55/66/44项目的确切顺序是否重要,或者它们是否只需要在最后列出?如果订单无关紧要,您可以这样做:
[i for i in correct_order if i in messed_order] +
list(set(messed_order) - set(correct_order))
答案 3 :(得分: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)
答案 4 :(得分: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 )[可能是方法或属性],或“脚本”(Python) )“当前文件夹或任何祖先文件夹中名为 script 的对象!实际上,它甚至不需要是一个脚本对象 - 尽管为了您的目的,它需要是一个返回列表的对象。
与Thanatos所说的“任意限制部”相比,它更像是没有足够的限制!