如何使用sort函数实现类似队列的容器

时间:2013-11-29 01:56:45

标签: python python-3.x pyqt pyside

我想要一个固定长度的类似列表的容器,它应该有一个sorted() - 类似的函数,我可以用来对它进行排序,我认为还应该有一个函数我可以用它来检测项目的数量是多少在它达到容器的长度,因为如果它的项目数量达到容器的长度(固定),我想处理它中的数据。在Python中有一个像这样的容器吗?如果没有,什么基础容器应该用于实现这样的容器吗?

容器类似于队列,但队列没有排序功能

2 个答案:

答案 0 :(得分:0)

如果需要,您可以创建自己的容器类。以下是一个非常简单的示例,可能会指出您正确的方向。

class MyContainer:
    def __init__(self, size, key=None, func=None):
        self.size = size
        self.items = []
        self.key = key
        self.func = func

    def add_item(self, item):
        if not self.is_full():
            self.items.append(item)
        else:
            # Handle cases where the container is full, by raising an exception
            # or printing an error message
            #raise Exception('The container is full')
            print("Container is full")
            return
        if len(self.items) == self.size:
            self.sort_items(self.key)
            self.process_items(self.sort)

    def is_full(self):
        return len(self.items) >= self.size

    def sort_items(self, key):
        self.items = sorted(self.items, key=key)

    def process_items(self, func):
        self.items = map(func, self.items)

使用key=lamba x: len(x)func=str.lower调用此函数会根据项目的长度对列表进行排序,并将所有字符串转换为小写。

>> c = MyContainer(3, key=lambda x: len(x), func=str.lower)
>> c.add_item('a')
>> c.add_item('aBcD')
>> c.add_item('ab')
>> print(c.items)

['a', 'ab', 'abcd']

答案 1 :(得分:0)

听起来PriorityQueue符合规范。这允许以任何顺序(最多)将项目添加到队列中,但是它们将按排序顺序从队列中删除:

import queue, random

items = list(range(15))
random.shuffle(items)

pq = queue.PriorityQueue(5)

while items:
    pq.put_nowait(items.pop())
    if pq.full():
        print('processing...')
        while not pq.empty():
            print(pq.get_nowait())
        print()

输出:

processing...
0
4
5
8
14

processing...
1
2
10
11
13

processing...
3
6
7
9
12