Можно ли ограничить количество итераций, а также сохранить элементы итератора в списке с помощью itertools? - PullRequest
1 голос
/ 10 апреля 2019

У меня есть несколько строк (всего более 50), которые должны появиться на нескольких графиках, и я хотел бы сохранить их, используя многочисленные маркеры. Увы, количество маркеров в matplotlib ограничено тем, что число затмевается количеством строк. Потратив час на поиски ответа, я определил itertools.cycle как потенциальное решение, поскольку оно позволяет мне циклически проходить серию. Скажем, например, я хочу перебрать пять маркеров:

import itertools    
markers = itertools.cycle(('o', 'D', '*', 'X', '+'))

Однако вскоре я осознал необходимость ограничения цикла определенным числом (т. Е. Числом строк) и сохранения их в списке, потому что линии появятся на нескольких графиках, и я хотел бы, чтобы маркеры были согласованными. Я столкнулся с другим вопросом ( Существует ли элегантный способ циклически проходить по списку N раз с помощью итераций (например, itertools.cycle, но ограничивать циклы)? ), который, по-видимому, решает ограниченную часть моей проблемы с помощью:

import itertools
n = 50 # number of lines
itertools.chain.from_iterable(itertools.repeat(['o', 'D', '*', 'X', '+'], n))

Итак, теперь мне нужно только выяснить, где хранится моя проблема.

  • Как мне ограничить количество итераций (кажется, что они решены), а также сохранить их как элементы в списке?

Если itertools не самый удобный способ, я был бы признателен, если бы кто-то мог указать мне более удобное направление.

1 Ответ

1 голос
/ 10 апреля 2019

Поскольку itertools.chain является итерируемым объектом, я просто запустил функцию list для результата конструктора itertools.chain.from_iterable следующим образом:

import itertools
n = 50 # number of lines
list(itertools.chain.from_iterable(itertools.repeat(['o', 'D', '*', 'X', '+'], n)))

И получил результат в виде списка.Длина списка составила 250, потому что он повторял всю серию 50 раз.

Надеюсь, это поможет.

Редактировать:

Конечно, если вы хотите использоватьВ списке просто установите переменную для результата примерно так:

var_name = list(itertools.chain.from_iterable(itertools.repeat(['o', 'D', '*', 'X', '+'], n)))
...