Python:使用另一个列表顺序对列表进行排序,具有不同的长度,并且没有“已排序”

时间:2010-09-03 05:41:49

标签: python list sorting plone

我将解释这一点:
我在一个不能使用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脚本(我认为这对于皮肤页面是不可能的,仅适用于浏览器页面。如果它是,告诉我如何做,我会做。)

5 个答案:

答案 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所说的“任意限制部”相比,它更像是没有足够的限制!