2012-04-18 2 views
1

У меня был список, например:Создание списка кортежей из списка

data=['January', 'February', 'March', 
     2007, 2008, 2009, 
     'value1', 'value2', 'value3'] 

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

[('January', 2007,'value1'),('February', '2007','value2'),('March', 2007,'value3'), 
('January', 2008,'value1'),('February', 2008,'value2'),('March', 2008,'value3'), 
('January', 2009,'value1'),('February', 2009,'value2'),('March', 2009,'value3')] 

Пожалуйста, дайте мне знать, концепция

+5

Это неправда Python, поэтому я не знаю, что вы хотите, чтобы список выглядел точно. Пожалуйста, исправьте это. – ch3ka

+0

Неправильная практика вызывать переменную 'list', потому что вы теряете доступ к встроенному« списку ». – jamylak

+0

@jamylak Это, кажется, было исправлено, а затем повторно введено редакторами - я вернусь к использованию '' data''. Я предполагаю, что список кортежей должен был иметь запятые на кончиках линий. –

ответ

1

Существует ряд решений, так как ваш вопрос был немного неоднозначным в отношении того, что вы хотели, вот те варианты, которые я бы предложил.

Что бы вы ни хотели, первым шагом является разбиение списка на независимые списки. Чистейший способ сделать это с помощью генератора (есть 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)] 
+0

Какая-то конкретная причина, по которой я получил это предложение? –

1

Что-то вроде:

>>> l1 = ['January', 'February', 'March'] 
>>> l2 = [2007,2008,2009] 
>>> l3 = ['value1','value2','value3'] 
>>> for year in l2: 
...  print zip(l1, [year] * len(l1), l3) 
... 
[('January', 2007, 'value1'), ('February', 2007, 'value2'), ('March', 2007, 'value3')] 
[('January', 2008, 'value1'), ('February', 2008, 'value2'), ('March', 2008, 'value3')] 
[('January', 2009, 'value1'), ('February', 2009, 'value2'), ('March', 2009, 'value3')] 

Разделение данного списка на куски дерева остается как упражнение для ОП.

0
>>> from itertools import product,cycle 
>>> data = ['January','February','March', 2007,2008,2009,'value1','value2','value3'] 
>>> block = 3 
>>> months,years,values = zip(*[iter(data)]*block) 
>>> [(m,y,v) for (y,m),v in zip(product(years,months),cycle(values))] 
[('January', 2007, 'value1'), ('February', 2007, 'value2'), ('March', 2007, 'value3'), 
('January', 2008, 'value1'), ('February', 2008, 'value2'), ('March', 2008, 'value3'), 
('January', 2009, 'value1'), ('February', 2009, 'value2'), ('March', 2009, 'value3')] 
Смежные вопросы