【问题标题】:shifting elements in fixed sized list在固定大小的列表中移动元素
【发布时间】:2015-02-13 09:41:15
【问题描述】:

我有一个固定大小为 10 的列表,我将以 2 秒的间隔放置我计算机的 CPU 百分比。 我想做的是, 删除第一个元素 将每个元素移动到列表的前一个索引 在列表的最后一个索引处记录第 11 个值

您可能会在下面看到我的代码。我做了一些调试,但我现在很困惑。我该如何解决这个问题?

__author__ = 'tim'
#-*- coding: utf-8 -*-
import psutil, os, time

def getCpuRate():
   myList = [None]*10
   myString=" "
   myString2 = " "
   i = 0
   j = 0

   while True:
      if myList[9] is None:
         myList[i] = psutil.cpu_percent(interval=2)
         myString = myString + (str(myList[i]) + " ")
         i = i+1
         print i , myString
         #time.sleep(3)
      else:
         while i>0:
            myList[j] = myList[j+1]
            #print myList[j+1] , myList[j]
            for k in range(len(myList)):
               myString2 = myString + (str(myList[k]) + "")
            print i , j , myString2
            j = j+1
            i = i-1
            if j >= 9:
               myList[j] = psutil.cpu_percent(interval=2)
               print i , j , myString2
               j -= 1


print "a"
getCpuRate()
'''
mySecondList = getCpuRate()
for x in range(len(mySecondList)):
   print mySecondList[x]
'''
print "b"

【问题讨论】:

  • 如果你只有 10 个元素,那么第 11 个元素适合哪里?
  • 我正在尝试将第 2 次覆盖到第 1 次,然后将第 3 次覆盖到第 2 次,依此类推。一旦第 10 个元素被复制到第 9 个,我需要将第 11 个元素写入第 10 个
  • 这是作业还是你可以简单地使用双端队列? from collections import deque deq = deque(maxlen=10)
  • 它不是硬件,我可以使用双端队列,但我只是不喜欢:)
  • if len(lst) > 10remove 第一项呢?

标签: python list psutil


【解决方案1】:

你为什么不使用deque

只需填写 10 个虚拟值,然后使用 appendpop。所以一切都向左移动。或者你指定双端队列的maxlen=10(最大长度)并且只使用append

【讨论】:

    【解决方案2】:

    您可以使用deque (documentation link) 而不是使用列表,这是针对您想要的操作类型优化的列表。

    import collections
    q = collections.deque()
    
    # add element at the end:
    q.append('cpu percentage here')
    # add element at the beginning:
    q.appendleft('cpu percentage here')
    
    # remove first element:
    q.popleft()
    # remove last element:
    q.pop()
    

    然后,你的循环就变得简单多了:

    import psutil
    import collections
    
    def getCpuRate():
        q = collections.deque(maxlen=10)
        while True:
            q.appendleft(psutil.cpu_percent(interval=2))
            print(q)
    

    请注意我的排序,以便我们在开头插入新值并在末尾删除旧值。这样,在打印 q 时,新值首先出现。如果您不希望这样,您可以将appendleft 更改为append 并将pop 更改为popleft

    【讨论】:

    • 我已经问过 OP 他们是否可以使用双端队列,得到的回答是我可以使用双端队列,但我只是不想:)
    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2014-06-09
    相关资源
    最近更新 更多