именованные итераторы: сжатие итераторов для возврата значений в виде словаря, а не кортежа - PullRequest
0 голосов
/ 09 мая 2018

Я хотел бы объединить несколько итераторов вместе, однако вместо кортежа я хотел бы, чтобы значения были "именованными", как в dict или namedtuple. Это позволило бы получить некоторую абстракцию и надежность, поскольку мне не нужно было бы точно знать, какие или сколько значений возвращаются и в каком порядке.

Есть ли стандартный способ сделать это в Python?

1 Ответ

0 голосов
/ 09 мая 2018

Я не нашел такого инструмента в itertools, может быть, где-то еще?

Тем временем это поведение может быть реализовано с помощью этой короткой функции:

def dictzip(**kwargs):
  for values in zip(*kwargs.values()):
    yield dict(zip(kwargs.keys(), values))

Тогда, например,

>>> name = ['Alice', 'Bob', 'Claire']
>>> age = [11, 22, 33]
>>> email = ['alice@example.com', 'bob@example.com', 'claire@example.com']
>>> for val in dictzip(name=name, age=age, email=email):
...   print('{name} {age} {email}'.format(**val))
...
Alice 11 alice@example.com
Bob 22 bob@example.com
Claire 33 claire@example.com

Это также можно использовать для перебора словаря в стиле «структура-массив»:

>>> people = {
...    'name': ['Alice', 'Bob', 'Claire'],
...    'age': [11, 22, 33],
...    'email': ['alice@example.com', 'bob@example.com', 'claire@example.com']}
>>> for val in dictzip(**people):
...   print('{name} {age} {email}'.format(**val))
...
Alice 11 alice@example.com
Bob 22 bob@example.com
Claire 33 claire@example.com

(отредактировано с учетом предложения @ YannVernier о форматировании)

...