2016-06-24 31 views
1

我來與我的任務結束了,我不知道我來自哪裏,我現在去哪裏,代碼目前正在尋找這樣的:基數排序,「隊列」對象不是可迭代

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 
+0

是的,這不是[可迭代](http://stackoverflow.com/q/9884132/3001761);你沒有定義'__iter__'或'__getitem__'。另外,根據[數據模型](https://docs.python.org/3/reference/datamodel.html),你應該重命名現有的方法 – jonrsharpe

+0

不能說我確定我做了什麼但我確實把 def __iter __(個體經營): \t \t迴歸自我 在我班上的功能,但現在我得到的錯誤:ITER()返回典型「排隊」的非迭代器,我認爲我的代碼的結局是錯誤的,以及... –

+0

請[編輯]這個問題,代碼(尤其是Python)在評論中幾乎不可讀。 – jonrsharpe

回答

1

您需要添加更多的代碼才能使其成爲可迭代的。 __iter__應該返回一個迭代器。迭代器應該有一個next方法。

在此請看:

Build a Basic Python Iterator

所以這是我的理解是要遍歷的事情是self.lista ......內容爲什麼不直接返回lista的迭代器。

下面是做到這一點的最簡單的方法:

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

這是一個有點很難看到它到底是什麼,你想..如果你正在嘗試做,因爲你迭代它是空lista (隊列是一個fifo有點兒交易)它然後這樣做:

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 
+0

謝謝您的評論,這對我來說很新穎,沒有意識到我的任務會變得複雜。 –

+0

有沒有像解決radixsorting問題更容易的方法,我不能說我明白,即使我讀了你發佈的內容,我是新來的,我不明白我如何才能解決問題,參考我的__init__和他得到低和高...以及 –

+0

非常感謝你花時間! –