Как перебрать два списка в dict, используя __next__ python

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, содержащий ключ/значение элемента и суммы

Не могли бы вы привести пример того, что вы имеете в виду? Вы хотите, чтобы next(Checkout()) вернул что-то вроде {'item': "foo", 'amount': 1}?

chepner 14.12.2020 23:02

Возможно, вы захотите рассмотреть что-то вроде yield from (dict(item=x, amount=y) for x,y in zip(self.__items, self.__amounts)) и пропустить явное определение __next__. Это позволяет использовать несколько независимых итераторов для каждого экземпляра Checkout.

chepner 14.12.2020 23:07

Кроме того, имеют ли элементы и суммы одинаковую длину? Похоже, вы должны быть уверены в этом

Gonzalo 14.12.2020 23:08

И есть ли причина хранить предметы и их суммы отдельно, а не (скажем) в одном списке кортежей, в которых каждый элемент явно оплачивается своей суммой?

chepner 14.12.2020 23:09

@chepner, можете ли вы опубликовать решение, мне любопытно увидеть эту альтернативу yield для независимых итераторов =)

Gonzalo 14.12.2020 23:18

Точно @chepner, но больше похоже на {"foo":1.00}, также согласно спецификациям я должен использовать два отдельных списка, чтобы лучше понять, как использовать next для их итерации и помещения их в словарь.

Nader 14.12.2020 23:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
110
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это может решить вашу проблему. Но, возможно, вы можете использовать только один список кортежей.

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, который дает желаемые dicts.

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}

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