如何对任意可索引集合进行有效的就地排序?

问题描述

问题

如何使用Python的内置排序(或类似方法)在任意集合上进行就地排序(它支持__len__,{{ 1}}和__getitem__方法)?

背景

这个问题源于考虑以下问题(与this question有关)。假设我有两个长度相等的大列表:

__setitem__

(在此示例中表示时间20:15、21:14等)。

我想将这些列表作为两个列表中的值对(例如,由hours = [20,21,18,19] minutes = [15,14,13,12,11] 重新定义的值)就地排序在一起,以给出:

zip

可以通过将两个列表封装到一个自定义集合中来实现此目的,该集合在建立索引时使用成对的值,然后对该集合进行排序。

这是集合类:

hours   = [18,19,20,21]
minutes = [12,11,15,14]

我们可以通过对顶层集合进行就地排序来以内存有效的方式对基础列表进行排序。但是以下示例使用了CPU效率低的排序算法。

class Times:
    
    def __init__(self,hours,minutes):
        if len(hours) != len(minutes):
            raise ValueError('lists must be of same length')
        self.hours = hours
        self.minutes = minutes

    def __getitem__(self,i):
        return (self.hours[i],self.minutes[i])

    def __setitem__(self,i,vals):
        self.hours[i],self.minutes[i] = vals

    def __len__(self):
        return len(self.hours)

或者,我们可以使用Python效率更高的内置def bubble_sort(x): n = len(x) for last in range(n-1,-1): for pos in range(last): if x[pos] > x[pos+1] : x[pos],x[pos+1] = x[pos+1],x[pos] hours = [20,11] times = Times(hours,minutes) bubble_sort(times) print(hours) # [18,21] print(minutes) # [12,14] ,但随后我们将分配更多的内存,因为它不是就地排序。

sorted

因此,希望能够使用Python的内置排序(或类似方法)进行就地排序。这是对列表以外的其他东西使用hours = [20,minutes) for i,v in enumerate(sorted(times)): times[i] = v print(hours) # [18,21] print(minutes) # [12,14] 的尝试失败-不支持:

list.sort

这怎么办?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)