В Python (3) я хочу создать список, который будет содержать последние 5 введенных в него переменных. Вот пример:
>>>l = []
>>>l.append('apple')
>>>l.append('orange')
>>>l.append('grape')
>>>l.append('banana')
>>>l.append('mango')
>>>print(l)
['apple','orange','grape','banana','mango']
>>>l.append('kiwi')
>>>print(l)
['orange','grape','banana','mango','kiwi'] #only 5 items in list
Итак, в Python есть ли способ добиться того, что показано выше? Переменная не обязательно должна быть списком, я просто использовал ее в качестве примера.
Благодаря!
list
массива ac.Я столкнулся с этой же проблемой ... maxlen = 5 from deque НЕ поддерживался из-за проблем со скоростью / надежностью доступа.
ПРОСТОЕ РЕШЕНИЕ:
l = [] l.append(x) # add 'x' to right side of list l = l[-5:] # maxlen=5
После добавления просто переопределите «l» как последние пять элементов «l».
Назовите это Готово.
Для ваших целей вы могли бы остановиться прямо здесь ... но мне нужен был popleft (). В то время как pop () удаляет элемент справа, где он был только что добавлен ... pop (0) удаляет его слева:
if len(l) == 5: # if the length of list 'l' has reached 5 right_in_left_out = l.pop(0) # l.popleft() else: # right_in_left_out = None # return 'None' if not fully populated
Совет от Джеймса на Tradewave.net
Нет необходимости в функциях класса или двухсторонней очереди.
Далее ... добавить влево и открыть вправо:
l = [] l.insert(0, x) # l.appendleft(x) l = l[-5:] # maxlen=5
Будет вашим эквивалентом appendleft (), если вы захотите загрузить свой список без использования deque
Наконец, если вы выберете добавление слева ...
if len(l) == 5: # if the length of list 'l' has reached 5 left_in_right_out = l.pop() # pop() from right side else: # left_in_right_out = None # return 'None' if not fully populated
источник
Вы можете создать подкласс
list
>>> class L(list): ... def append(self, item): ... list.append(self, item) ... if len(self) > 5: del self[0] ... >>> l = L() >>> l.append('apple') >>> l.append('orange') >>> l.append('grape') >>> l.append('banana') >>> l.append('mango') >>> print(l) ['apple', 'orange', 'grape', 'banana', 'mango'] >>> l.append('kiwi') >>> print(l) ['orange', 'grape', 'banana', 'mango', 'kiwi'] >>>
источник
insert
,extend
иsetitem
методы (l[1:1] = range(100)
) для этого , чтобы быть надежными.del self[0]
.__add__
такжеdeque
работает медленно для произвольного доступа и не поддерживает нарезку. Следуя предложению Гниблера, я собрал полныйlist
подкласс.Однако он предназначен для "прокрутки" только справа налево. Например,
insert()
на «полный» список не повлияет.class LimitedList(list): # Read-only @property def maxLen(self): return self._maxLen def __init__(self, *args, **kwargs): self._maxLen = kwargs.pop("maxLen") list.__init__(self, *args, **kwargs) def _truncate(self): """Called by various methods to reinforce the maximum length.""" dif = len(self)-self._maxLen if dif > 0: self[:dif]=[] def append(self, x): list.append(self, x) self._truncate() def insert(self, *args): list.insert(self, *args) self._truncate() def extend(self, x): list.extend(self, x) self._truncate() def __setitem__(self, *args): list.__setitem__(self, *args) self._truncate() def __setslice__(self, *args): list.__setslice__(self, *args) self._truncate()
источник
Вы можете использовать ограниченную коллекцию в PyMongo - это излишне, но она отлично справляется со своей задачей:
import pymongo #create collection db.createCollection("my_capped_list",{capped:True, max:5}) #do inserts ... #Read list l = list(db.my_capped_list.find())
Следовательно, каждый раз, когда вы звоните
my_capped_list
, вы получаете последние 5 вставленных элементов.источник
Чаще всего, когда вам нужно такое средство, вы должны написать функцию, которая берет список, а затем возвращает последние пять элементов.
>>> l = range(10) >>> l[-5:]
Но если вам действительно нужен настраиваемый список, имеющий ограничение на пять элементов, вы можете переопределить встроенный список и его методы, вы бы сделали что-то вроде этого для всех его методов.
class fivelist(list): def __init__(self, items): list.__init__(self, items[-5:]) def insert(self, i, x): list.insert(self, i, x) return self[-5:] def __getitem__(self, i): if i > 4: raise IndexError return list.__getitem__(self, i) def __setitem__(self, i, x): if 0<= i <= 4: return list.__setitem__(self, i, x) else: raise IndexError
источник
return
Вinsert()
бессмысленна, так какlist.insert
предназначен для работы на месте.Это может быть так же просто, как решение ниже
lst = [] arr_size = int(input("Enter the array size ")) while len(lst) != arr_size: arr_elem= int(input("Enter the array element ")) lst.append(arr_elem) sum_of_elements = sum(lst) print("Sum is {0}".format(sum_of_elements))
источник