【问题标题】:How can I go through a list 100 elements at a time?我怎样才能一次浏览 100 个元素的列表?
【发布时间】:2023-01-02 00:03:59
【问题描述】:

我得到了一个包含 958 个元素的列表。

myList = [1, 2, 3, 4, ..., 958]

我想取前 100 个元素,然后取下 100 个(从 100 到 200)等等。

我试过的:

sum = 0
ct = 0
for i in range(len(myList):
   sum = sum + myList[i]
   ct = ct + 1
   if ct == 100:
      ct = 0 
      print(sum)
      sum = 0

它在第 900 个元素之前一直有效。然后它不能对 myList 的最后 58 个元素求和,因为 ct 不会得到 100。

有任何想法吗?

【问题讨论】:

  • 当你得到 100 的倍数时,你只打印一个总和。所以你永远不会打印最后 58 个元素的总和。
  • 您不是在对列表元素求和,而是在对索引求和。使用for i in myList: 对元素求和。
  • 您还有效地使用 ct 来复制 i 的值。如果您遵循@Barmar 的建议,也可以考虑使用枚举:for i, n in enumerate(myList):
  • 50 x 50 元素列表在哪里?
  • @Barmar 我用myList[i] 修复了。

标签: python list


【解决方案1】:

一次遍历列表 100 并对切片求和。超出列表末尾的切片被正确处理:

myList = list(range(1,959))

for i in range(0,len(myList),100):
    sub = myList[i:i+100]
    print(f'sum of {sub[0]}..{sub[-1]} is {sum(sub)}')

输出:

sum of 1..100 is 5050
sum of 101..200 is 15050
sum of 201..300 is 25050
sum of 301..400 is 35050
sum of 401..500 is 45050
sum of 501..600 is 55050
sum of 601..700 is 65050
sum of 701..800 is 75050
sum of 801..900 is 85050
sum of 901..958 is 53911

【讨论】:

    【解决方案2】:

    因为只有在达到 100 的倍数时才打印总和,所以永远不会打印最后一组元素的总和,因为它不是 100 个元素。要获得最后一组,请在循环结束后打印总和。

    您还可以使用 enumerate() 直接在循环中获取索引,而不是递增您自己的 ct 变量。

    total = 0
    for i, item in enumerate(myList, 1):
        total += item
        if i % 100 == 0:
            print(total)
            total = 0
    # Print the final group
    if i % 100 != 0:
        print(total)
    

    我还将sum变量重命名为total,因为sum是内置函数的名称。

    【讨论】:

      【解决方案3】:

      来自 itertools 模块的文档:

      from itertools import zip_longest
      
      
      def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
          "Collect data into non-overlapping fixed-length chunks or blocks"
          # grouper('ABCDEFG', 3, fillvalue='x') --> ABC DEF Gxx
          # grouper('ABCDEFG', 3, incomplete='strict') --> ABC DEF ValueError
          # grouper('ABCDEFG', 3, incomplete='ignore') --> ABC DEF
          args = [iter(iterable)] * n
          if incomplete == 'fill':
              return zip_longest(*args, fillvalue=fillvalue)
          if incomplete == 'strict':
              return zip(*args, strict=True)
          if incomplete == 'ignore':
              return zip(*args)
          else:
              raise ValueError('Expected fill, strict, or ignore')
      
      
      for century in grouper(myList, 100, fillvalue=0):
          print(sum(century))
      

      【讨论】:

        【解决方案4】:

        您可以按如下方式对列表进行切片:

        for k in range(0, len(mylist), 100):
          print(sum(mylist[k:k+100]))
        

        这将打印 100 组元素的总和。如果列表长度不是 100 的精确倍数,最后的总和将是剩余元素的总和

        【讨论】:

          【解决方案5】:

          尝试以下操作:

          index = 1
          slicesize = 100
          
          start = 0
          end = 100
          
          myList = range(1, 958)
          
          while True:
              myslice = myList[start:end]
              
              index += 1
              start = end
              end = index * slicesize
              if start > len(myList):
                  break
          

          【讨论】:

            【解决方案6】:

            我相信这应该可以解决问题。

            import random
            
            # generate list with N elements, each of which is a random integer in [0, 99]
            N = 57
            random.seed()
            myList = [random.randint(0, 99) for i in range(0, N)]
            
            # Calculate total number of prints before there will be less than num_elem
            # elements remaining in the list.
            num_elem = 10
            total_prints = len(myList) // num_elem
            
            for i in range(0, total_prints):
                index = i * num_elem
                print(sum(myList[index:index + num_elem]))
            
            # if there are remaining elements, print their sum
            if (len(myList) % num_elem) != 0:
                print(sum(myList[index + num_elem:]))
            

            【讨论】:

            • 解决了。只需看一下已接受的答案。
            • 抱歉,页面没有更新。之前没有答案。
            【解决方案7】:
            def n_elements_per_call(iterable, n=100):
                buffer = []
                for i in iterable:
                    buffer.append(i)
                    if len(buffer) < n:
                        continue
                    yield buffer
                    buffer.clear()
                if buffer:
                    yield buffer
            
            my_list = list(range(959))
            for nums in n_elements_per_call(my_list):
                print(nums)
            
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-04-26
              • 2016-04-07
              • 2022-12-10
              • 1970-01-01
              • 1970-01-01
              • 2014-12-04
              • 2023-03-19
              • 1970-01-01
              相关资源
              最近更新 更多