Существует ряд решений, так как ваш вопрос был немного неоднозначным в отношении того, что вы хотели, вот те варианты, которые я бы предложил.
Что бы вы ни хотели, первым шагом является разбиение списка на независимые списки. Чистейший способ сделать это с помощью генератора (есть other ways делать это для генераторов, в отличие от списков, но для случая использования, что излишество):
def segments(l, n):
for i in range(0, len(l), n): #Use xrange in python 2.x
yield l[i:i+n]
Хотя вполне возможно использовать выражение генератора, это не особенно читает:
(data[y:y+3] for y in range(0, len(data), 3))
Везде, где я использую segments(data, 3)
, вы могли бы использовать это выражение вместо генератора, но я буду придерживаться более читаемой версии.
Если вы хотите выход согласованного (month, year, value)
, то ответ очень прост:
list(zip(*segments(data, 3)) #No need to use list() in 2.x
Производит:
[('January', 2007, 'value1'), ('Febraury', 2008, 'value2'), ('March', 2009, 'value3')]
Мы распаковывать наши три списка в качестве аргументов в zip()
, который дает нам генератор (month, year, value)
элементов.
Если вы хотите, все комбинации (month, year, value)
, то вы можете использовать itertools.product()
:
from itertools import product
...
list(product(*segments(data, 3))
Если вы только хотели, как подсказывает ваш выход, набор продукт месяца привязан к стоимости и года, то вам нужно:
from itertools import product
...
months, years, values = segments(data, 3)
[(month, year, value) for ((month, value), year) in product(zip(months, values), years)]
Это неправда Python, поэтому я не знаю, что вы хотите, чтобы список выглядел точно. Пожалуйста, исправьте это. – ch3ka
Неправильная практика вызывать переменную 'list', потому что вы теряете доступ к встроенному« списку ». – jamylak
@jamylak Это, кажется, было исправлено, а затем повторно введено редакторами - я вернусь к использованию '' data''. Я предполагаю, что список кортежей должен был иметь запятые на кончиках линий. –