2016-10-23 35 views
-2
from collections import defaultdict 
from goody import type_as_str 

class Bag: 
    def __init__(self, i=None): 
     self.bag = [] 
     if i == None: 
      pass # i is None, do nothing after create empty bag 
     elif type(i)==list: 
      self.bag.extend(i) # append whole list i into bag with extend method 
     else: 
      self.bag.append(i) # append single item i into bag 

    def __repr__(self): 
     for s in self.bag : 
      return s 

    def __str__(self): 
     for s in self.bag : 
      return s 

    def __len__ (self): 
     if 'Bag()' in self.bag: 
      return 0 
     else: 
      return len(self.bag) 
    def unique(self): 
     l = [] 
     if len(self.bag) == 0: 
      return 0 
     else: 
      for x in self.bag: 
       if x not in l: 
        l.append(x) 
       else: 
        continue 
      return len(l) 

    def __contains__ (self,i): 
     if i in self.bag: 
      return True 
     else: 
      return False 

    def count(self,i): 
     return self.bag.count(i) 

    def add(self,i): 
     self.bag.append(i) 

    def __add__(self,i): 
     for x in i: 
      self.bag.append(x) 

    def remove(self,i): 
     if i not in self.bag: 
      raise ValueError 
     for x in self.bag: 
      if x == i: 
       self.bag.remove(x) 
       break 


    def __eq__ (self,i): 
     return self.bag == i 

    def __ne__ (self,i): 
     return self.bag != i 

    def __iter__(self): 
     class PH_iter: 
      def __init__(self,i): 

       self.l = i 

      def add(self,i): 
       self.l.append(i) 

      def remove(self,i): 
       self.l.pop(i) 

     return PH_iter(self.l) 




if __name__ == '__main__': 
#driver tests 
import driver 
driver.default_file_name = 'bsc1.txt' 
#  driver.default_show_exception= True 
#  driver.default_show_exception_message= True 
#  driver.default_show_traceback= True 
driver.driver() 

Bag函数通常会返回一个列表。书写袋()构成一个空袋子。书包(['d','a','b','d','c','b','d'])构成一个'a',两个'b','c' ,还有三个'd'。如何修复__iter__方法

iter方法应该在bag类中定义,以便从列表中添加或删除项目。

输入是:

# Test iterator 
e-->[i for i in sorted(b)]-->['a', 'b', 'b', 'c', 'd', 'd', 'd'] 
c-->i = iter(b) 
c-->b.add('d') 
c-->b.remove('a') 
e-->[i for i in sorted(b)]-->['b', 'b', 'c', 'd', 'd', 'd', 'd'] 
e-->[i for i in sorted(x for x in i)]-->['a', 'b', 'b', 'c', 'd', 'd', 'd'] 

我得到的错误是:

94 # Test iterator 
95 *Error: [i for i in sorted(b)] raised exception AttributeError: 'Bag' object has no attribute 'l' 
96 *Error: i = iter(b) raised exception AttributeError: 'Bag' object has no attribute 'l' 
99 *Error: [i for i in sorted(b)] raised exception AttributeError: 'Bag' object has no attribute 'l' 
100 *Error: [i for i in sorted(x for x in i)] raised exception NameError: name 'i' is not defined 

谁能帮我解决了ITER功能,使其工作?非常感谢。

+4

“iter方法应该在包类中定义,以便从列表中添加或删除项目。” - 这根本不是'__iter__'方法的设计目的。你确定你理解你的任务吗? – user2357112

+0

请参阅['python.org上的object .__ iter__'规范](https://docs.python.org/3/reference/datamodel.html#object.__iter__) – zvone

+0

您是否使用Python 2.x?如果是这样的话:'Bag Bag(object):' –

回答

0

__iter__,这条线是导致运行时错误

return PH_iter(self.l) 

应该

return PH_iter(self.bag) 

实施这一项目将会给你迭代后有些吃惊,因为它实际上修改的数据内容的self.bag

您可以通过改进

def __iter__(self): 
    class PH_iter: 
     def __init__(self,i): 
      self.l = list(i) # make a copy of the list i 
+0

我改变了它,我得到以下错误: – weiyiwang

+0

*错误:[我为我在排序(b)]异常TypeError:iter()返回非迭代类型' PH_iter' 96 *错误:i = iter(b)引发异常TypeError:iter()返回类型为'PH_iter'的非迭代器 99 *错误:[i for sorting(b)]引发异常TypeError:iter )返回类型为'PH_iter'的非迭代器 100 *错误:[i for i in sort(x for x in i)]引发异常NameError:名称'i'未定义 – weiyiwang

+0

你知道什么是“iter()返回类型为'PH_iter'的非迭代器应该表示? – weiyiwang

相关问题