【问题标题】:Print out n elements of a list each time a function is run每次运行函数时打印出列表的 n 个元素
【发布时间】:2021-04-09 04:21:37
【问题描述】:

我有一个字符串列表,我需要创建一个函数,每次运行时打印出列表的 n 个元素。 例如:

book1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']

如果n = 5,我第一次运行该函数时的预期输出:

a
b
c
d
e

第二次:

f
g
h
i
j

我试过这个:

def print_book(book):
    printed = book
    while printed != []:
        for i in range(0, len(book), 5):
            new_list = (book[i:i+5])
            for el in new_list:
                print(el)
        break
    del(printed[i:i+10])

然后我要么打印出整个列表,要么在每次运行函数时打印前 n 个元素。 如果已经问过这个问题,请指出给我,我真的很感激。谢谢!

【问题讨论】:

  • 是要耗尽迭代器一次还是要遍历列表多次?
  • @theProgrammer 我想任何一种方式都可以,只要我只打印出 n 个连续的元素(而不是每次都打印出相同的 5 个元素,而不是整个列表)
  • @VarvaraLitvinova 是否要保留列表中的元素。还是可以在我们迭代时删除元素?
  • 如果你想以一种干净的方式做到这一点,你需要创建某种带有状态的数据结构,也就是一个对象。关闭也可以。在这种情况下,您将拥有一个函数,它将您的列表作为输入并返回一个函数,该函数在您每次调用它时传递列表的一部分。
  • 正如 nilo 所说,您必须依靠在函数调用之间存储状态。您要么更改全局变量(影响全局状态),这很简单,但不鼓励作为编程实践,要么将状态本地存储在函数或对象中。这可以(至少)使用自定义类、闭包、迭代器或利用可变默认参数来完成。我赞成这个问题,因为它有可能用不同的技术触发如此多不同的答案,让它变得有趣。

标签: python list for-loop


【解决方案1】:

一种常见的方法是生成器表达式。生成器表达式会在需要时为其生成值,因此不会立即创建整个列表

您的问题的解决方案可能是这样的

book1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']

def yield_book(book1):
    for i in book1:
        yield i;
                
def print_n_item(gen, n):
    count = 0
    for i in gen:
        if count == n:
            return
        print(i)
        count += 1
        
gen = yield_book(book1)
print_n_item(gen, 5) # prints a,  b,  c, d, e
print_n_item(gen, 5) # prints f,  g,  h,  i,  j
print_n_item(gen, 5) # prints k,  l,  m,  n,  o

这种方法耗尽了迭代器,因此可以使用一次,为了再次迭代,你必须调用yield_book来返回一个新的generator

【讨论】:

    【解决方案2】:

    我猜你可以试试下面这个应用于迭代器的用户函数book

    def print_book(book):
        cnt = 0
        while cnt < 5:
            try:
                print(next(book))
            except StopIteration:
                print("You have reached the end!")
                break
            cnt += 1
    

    这样

    >>> bk1 = iter(book1)
    >>> print_book(bk1)
    a
    b
    c
    d
    e
    >>> print_book(bk1)
    f
    g
    h
    i
    j
    >>> print_book(bk1)
    k
    l
    m
    n
    o
    >>> print_book(bk1)
    You have reached the end!
    

    【讨论】:

      【解决方案3】:

      正如评论中提到的,您确实希望将状态封装在某种数据结构中。课堂方法:

      class Printer:
          def __init__(self, book, n=5):
              self.book = book
              self.index = 0
              self.n = n
      
          def print(self):
              index = self.index
              self.index += self.n
              for t in self.book[index:self.index]:
                  print(t)
      
      
      book1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
      printer = Printer(book1)
      printer.print()
      print()
      printer.print()
      

      结果:

      a
      b
      c
      d
      e
      
      f
      g
      h
      i
      j
      

      【讨论】:

      • 与@ThomasIsCoding 的解决方案相比,在这个解决方案中,您基本上实现了自己的迭代器。虽然通常不应该重新发明轮子,但这是一种很好的学习方式。
      【解决方案4】:

      您可以定义一个特定的函数,利用函数中可变默认参数的行为(您可以用作函数的内存):

      book1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']
          
      def print_books(n, i=[0]):
          list(map(print, book1[i[0]:i[0] + n]))
          i[0] = (i[0] + n) if i[0] < len(book1) else 0
      
      print_books(5)
      print()
      print_books(5)
      

      n 是要打印的列表项的数量,一旦到达列表末尾,它就会重置为 0; i 是一个列表,用于存储尚未打印的第一个元素的索引。

      你应该避免使用这个特性,因为它会产生奇怪和意外的行为(看看here),但它可以用来保存函数的状态,我认为这里值得一提。

      【讨论】:

        【解决方案5】:

        作为函数工厂

        book_1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']
        
        def printer_factory(book, n = 5):
            i = 0
            def printer():
                nonlocal i
                stop = min(i+n, len(book))
                while i < stop:
                    print(book[i])
                    i += 1
            return printer
        
        printer_1 = printer_factory(book_1)
        
        printer_1()
        printer_1()
        

        【讨论】:

          【解决方案6】:

          我同意尼洛。以下是基于他的回答的解决方案。在此解决方案中,循环整个列表后,您将返回到列表的开头。

          book1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']
          
          class Printer:
              def __init__(self, book):
                  self.index = 0
                  self.book = book
          
              def print(self, n):
          
                  for i in range(0, n):
                      print(self.book[self.index % len(self.book)])
                      self.index += 1
          
          
          book = Printer(book1)
          book.print(5)
          print("")
          book.print(5)
          print("")
          book.print(7)
          
          

          输出:

          a
          b
          c
          d
          e
          
          f
          g
          h
          i
          j
          
          k
          l
          m
          n
          o
          a
          b
          
          
          

          【讨论】:

            【解决方案7】:

            我没有对你的程序做太多修改。所以这对你理解有点帮助。

            book1= ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']
            def print_book(book,a,n):
                printed = book
                if printed != []:
                
                    new_list=[]#i have created a list
                    for i in range(a,n+1):
                        new_list.append(book[i])#append is used to add elements to list
                    
                    for el in new_list:
                            print(el)
                
            print_book(book1,0,4)#prints a,b,c,d,e
            print_book(book1,5,9)#prints f,g,h,i,j
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-11-09
              • 1970-01-01
              • 2015-12-16
              • 1970-01-01
              • 2023-03-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多