Сдвигающиеся элементы в списке фиксированного размера
У меня есть список с фиксированным размером 10, в который я помещу процент загрузки моего компьютера с интервалом в 2 секунды. То, что я пытаюсь сделать, это удалить 1-й элемент, сдвигая каждый элемент в предыдущий индекс списка, записывая 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"
2 ответа
Вместо использования списка вы можете использовать deque
( ссылка на документацию), который представляет собой список, оптимизированный для требуемых операций.
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
,
Почему вы не используете deque?
Просто заполните 10 фиктивных значений и затем используйте append
а также pop
, Так что все смещено влево. Или вы указываете maxlen=10
(максимальная длина) deque и использовать только append
,