Присоединяйтесь к элементам списков генераторов - PullRequest
1 голос
/ 05 марта 2020

У меня есть два списка генераторов:

  • letters= ('AA', 'AB',...,'AZ) digits= (0,1,2,3,...,9)

Из букв и цифр я хотел бы получить третий генератор list (names), так что:

  • names= ('AA0', 'AA1'.., 'AA9', 'AB0',..'AB9',...'AZ0',...,'AZ9').

Я несколько дней пытался добиться «имен» с помощью функций itertools, но не могу достичь желаемого результат.

Последнее, что я попробовал, было:

'''
names= dict((key, digits) for key in letters)

def naming():
    for key in names.keys():
        for dig in names.values():
            yield(''.join('{}{}'.format(key, dig)))

names= ('{}{}'.format(key, value) for key, value in names.items())
'''

Но это не работает, и я определенно хочу список генераторов.

Спасибо за вашу помощь .

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Использование itertools.product:

from itertools import product

letters = ("AA", "AB")
digits = (0,9)

["".join(p) for p in product(letters, map(str, digits))]

Вывод:

['AA0', 'AA9', 'AB0', 'AB9']
1 голос
/ 05 марта 2020

Что не так в этом фрагменте - это итерация по names.values() во внутренней l oop.

>>> let=['a','b','c']
>>> dig=[1,2,3]
>>> nms=dict((key, dig) for key in let)
>>> nms
{'a': [1, 2, 3], 'b': [1, 2, 3], 'c': [1, 2, 3]}
>>> nms.values()
dict_values([[1, 2, 3], [1, 2, 3], [1, 2, 3]])

Вы должны переписать его как

def fn():
 for k in nms.keys():
  for d in nms[k]:
   yield(''.join('{}{}'.format(k,d)))
list(fn())
# ['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...