Python:用另一个顺序列表排序不同长度的列表,不使用'sorted

2 投票
5 回答
5659 浏览
提问于 2025-04-16 03:39

我来好好解释一下这个情况:
我现在的环境里,不能使用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 个回答

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

在你的皮肤中创建一个 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 版本。

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]

撰写回答