【问题标题】:Radix sorting, "Queue" object not iterable基数排序,“队列”对象不可迭代
【发布时间】:2016-06-24 10:34:51
【问题描述】:

我的任务已经结束了,我现在不知道从哪里开始,代码目前看起来像这样:

def radixsorting1(n,m):
    div=1
    mod=10
    bin_list=[]
    alist=[]
    r=[]
    s=[]
    for bins in range(0,10):
        bin_list.append(Queue())
    for k in range(0,m):
        r.append(random.randint(1,10**n))
    if not len(r)==0:
        o=max(r)
        y=len(str(o))
    for p in range(y):
        for num in r:
            minsta_tal=num%mod
            minsta_tal=int(minsta_tal//div)
            bin_list[minsta_tal].put(num)
        new_list=[]
        for bins in bin_list:
            while not bins.isempty():
                new_list.append(bins.dequeue())
            alist=new_list
        return alist

我一直在尝试做的是创建 10 个队列,将它们放在一个列表中,然后从 1 到 10^n 随机 m 个数字。假设我得到 66 和 72,然后我首先按“小数”对它们进行排序,即我的数字中的 6 和 2,然后将它们放入丢失的位置,然后重新执行该过程,但数字 6 和7(较大的数字)。在其当前形状中,我得到错误“队列”对象不可迭代。

我的 Queue 类是这样的,我觉得这个还可以。

class Queue:
    def __init__(self):
        self.lista=[]

    def put(self,x):
        self.lista.append(x)

    def get(self):
        if not len(self.lista)==0:
            return self.lista.pop(0)

    def isempty(self):
        if len(self.lista)==0:
            return True
        else:
            False

    def length(self):
        return len(self.lista)


    def dequeue(self):
        if not len(self.lista)==0:
            n=self.lista.pop(0)
            return n

【问题讨论】:

  • 是的,那不是iterable;你没有定义__iter____getitem__。另外,根据the data model,您应该重命名现有方法
  • 不能说我确定我做了什么,但我确实把 def __iter__(self): return self 放在了我的类函数中,但现在我得到了错误:iter() returned non-iterator of typ "Queue" ,而且我认为我的代码结尾也是错误的......
  • edit这个问题,代码(尤其是Python)在cmets中几乎不可读。
  • 对不起,这就是我的意思:正如你在代码中所说的那样,我确实在我的类队列中放了一些新代码。我仍然收到错误 Iter() 返回了“队列”类型的非迭代器。我也觉得我的 radixsorting1 代码的结尾是错误的,但我不确定如何结束它....
  • 如果你是return self from __iter__ 你还需要实现__next__

标签: python list python-3.x queue radix


【解决方案1】:

您需要添加更多代码以使其成为可迭代的。 __iter__ 应该返回一个迭代器。迭代器应该有一个next 方法。

看看这个:

Build a Basic Python Iterator

所以我的理解是,您要迭代的是 self.lista 的内容...为什么不直接返回 lista 的迭代器。

这是最简单的方法:

class Queue:
    ...
    def __iter__(self):
        return self.lista.__iter__()

很难看出你到底想要什么。如果你试图做的是空的lista当你迭代它时(队列是一个先进先出的交易),那么宁愿这样做:

class Queue:
    ...
    def __iter__(self):
        return self
    def next(self):
        if self.lista: #since empty lists are Falsey
            return self.lista.pop(0)
        raise StopIteration

【讨论】:

  • 感谢您的评论,这对我来说很新鲜,没想到我的任务会这么复杂。
  • 是否有更简单的方法来解决基数排序问题,即使我确实阅读了您发布的内容,我也不能说我理解,我是新手,我不明白如何解决问题当我的 init 中只有自引用时,他也变得低和高....
  • 非常感谢您抽出宝贵时间!
  • 我现在正在调用该函数,但几乎没有发生任何事情,通过 labb73.radixsorting1(5,5) 调用它...什么也没发生,我在哪里搞砸了?
  • @A.Maine 你更新你的代码了吗?看起来您实际上并没有使用迭代器。对于我认为的迭代器,__next__ 也应该是 next。但也许这些是同一回事。您应该可以执行以下操作:for x in q: do_whatever(x).
猜你喜欢
  • 1970-01-01
  • 2016-08-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2018-08-19
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多