Сдвигающиеся элементы в списке фиксированного размера

У меня есть список с фиксированным размером 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,

Другие вопросы по тегам