class Checkout():
def __init__(self, name):
self.__items = []
self.__amounts = [] # The number of each item
self.__person_name = name
def __iter__(self):
self.iterIndex = -1
return self
def __next__(self):
pass
Как мне использовать функцию _ next _ для перебора обоих списков и возврата их в словарь размером 2, содержащий ключ/значение элемента и суммы
Возможно, вы захотите рассмотреть что-то вроде yield from (dict(item=x, amount=y) for x,y in zip(self.__items, self.__amounts))
и пропустить явное определение __next__
. Это позволяет использовать несколько независимых итераторов для каждого экземпляра Checkout
.
Кроме того, имеют ли элементы и суммы одинаковую длину? Похоже, вы должны быть уверены в этом
И есть ли причина хранить предметы и их суммы отдельно, а не (скажем) в одном списке кортежей, в которых каждый элемент явно оплачивается своей суммой?
@chepner, можете ли вы опубликовать решение, мне любопытно увидеть эту альтернативу yield для независимых итераторов =)
Точно @chepner, но больше похоже на {"foo":1.00}, также согласно спецификациям я должен использовать два отдельных списка, чтобы лучше понять, как использовать next для их итерации и помещения их в словарь.
Это может решить вашу проблему. Но, возможно, вы можете использовать только один список кортежей.
class Checkout():
def __init__(self):
self._items = [1,2,3]
self._amounts = [4,5,6] # The number of each item
def __iter__(self):
self.iterIndex = 0
return self
def __next__(self):
if self.iterIndex >= len(self._items):
raise StopIteration
else:
values = list(zip(self._items,self._amounts))[self.iterIndex]
self.iterIndex += 1
return {"items": values[0], "amount": values[1]}
a = Checkout()
i = iter(a)
print(next(i))
print(next(i))
print(next(i))
print(next(i))
__iter__
просто должен вернуть итератор, не обязательно объект, который будет служить своим собственным итератором. Одна из возможностей — вернуть generator
, который дает желаемые dict
s.
class Checkout:
def __init__(self, name):
self.__items = []
self.__amounts = []
self.__person_name = name
def __iter__(self):
for item, amount in zip(self.__items, self.__amounts):
yield {item: amount}
Не могли бы вы привести пример того, что вы имеете в виду? Вы хотите, чтобы
next(Checkout())
вернул что-то вроде{'item': "foo", 'amount': 1}
?