我有一个固定大小为10的列表,我将把计算机的CPU百分比放在2秒的间隔内。 我要做的是, 删除第一个元素 将每个元素转换为列表的先前索引 在列表的最后一个索引处记录第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"
答案 0 :(得分:0)
为什么不使用deque?
只需填写10个虚拟值,然后使用append
和pop
。所以一切都转移到左边。或者您指定双端队列的maxlen=10
(最大长度),仅使用append
。
答案 1 :(得分:0)
您可以使用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
。