Python:用另一个顺序列表排序不同长度的列表,不使用'sorted
我来好好解释一下这个情况:
我现在的环境里,不能使用Python自带的函数(比如'sorted'、'set'),不能声明方法,也不能使用条件语句(if),更不能用循环,除了以下几种情况:
可以调用方法(但每次只能调用一个,并且要把返回的结果保存在另一个变量里)
比如:foo python:item.sort(); # foo变量会保存item.sort()返回的值
然后可以用:bar python:foo.index(x);
还可以使用列表推导式
比如:[item['bla'] for item in 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]
现在,我需要根据'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的人,我在一个皮肤页面(.pt)上,那里没有辅助的Python脚本(我觉得皮肤页面是不能有的,只有浏览器页面可以。如果可以的话,告诉我怎么做,我会去试试)。
5 个回答
这里有一个可以删除 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)
在你的皮肤中创建一个 Script (Python)
对象,并把它当作一个函数来使用。TALES 表达式有其局限性,这是有原因的:它们只是用来帮助你生成 HTML 或 XML 标记,而不是用来处理复杂的业务逻辑。更好的做法是,创建一个合适的浏览器视图,避免使用通过网络编辑代码时的那些严格限制。
另外,你对 TALES 的理解可能有误。你 可以 使用像 sorted 和 set 这样的内置方法。而且,你可以用 test(condition, iftrue, iffalse) 来代替 if
,或者用老办法 condition and iftrue or iffalse
,但要注意,iftrue
的结果必须是可以被判断为真的。
更棒的是,你可以通过 modules
字典访问一些有限的 Python 模块,比如 modules['string']
。不过,要扩展这个功能,你需要在文件系统的 Python 模块中做额外的安全声明。
可以查看 TAL 文档中的 Python TALES 表达式部分。请注意,那里列出的 TALES 可访问的内置函数列表已经扩展,以支持更新的 Python 版本。
这个问题不好回答,因为我们不太清楚哪些是允许的,哪些是不允许的。不过,我们可以试试这个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]