2012-06-20 2 views
1

Я хочу преобразовать список dataset, где строка состоит из разных списков, в список newDataset, где каждая строка состоит из одного списка, состоящего из каждого элемента из разных списков из dataset.Python - Слияние списков в строке из списка

dataset = [ 
[[2,3,1],[1,2,9],[1,3,8]], 
[[1,4,1],[1,2,10],[9,3,1]], 
[[1,4,0],[1,4,9],[2,5,8]], 
] 

newDataset = [ 
[2, 3, 1, 1, 2, 9, 1, 3, 8], 
[1, 4, 1, 1, 2, 10, 9, 3, 1], 
[1, 4, 0, 1, 4, 9, 2, 5, 8] 
] 

я придумал следующую строку кода:

from itertools import chain 
newDataset = [list(chain(*x)) for x in dataset] 

Но, я полагаю, есть более вещий путь?

Другой связанный с этим вопрос: Как я могу создать newDataset2, где каждая строка состоит из первого элемента из разных списков строки?

newDataset2 = [ 
[2,1,1], 
[1,1,9], 
[1,1,2], 
] 
+2

Ваше решение в порядке ... Рекомендация - использовать переменные_names_with_underscores вместо CamelCase. – jamylak

+1

Второй простой: 'newDataset2 = [списки [0] для списков в наборе данных]' – phg

+1

@jamylak спасибо за tipp. Мои привычки java начались. Началось программирование на Python месяц назад. Очень нравится то, что я вижу до сих пор. –

ответ

3
itertools.chain(*x) 

лучше выражен как

itertools.chain.from_iterable(x) 

, но в остальном хорошо.

Кроме того,

>>> [[x[0] for x in y] for y in dataset] 
[[2, 1, 1], [1, 1, 9], [1, 1, 2]] 
+0

Вы бы сказали, что «chain.from_iterable» - лучший способ сделать это? Я слышал от других, и я считаю, что длинное имя делает его раздражающим, если только производительность не является проблемой. – jamylak

+1

@jamylak, который выглядит более читаемым. но вы правы, это определенно короче. – zinking

1
dataset = [ 
[[2,3,1],[1,2,9],[1,3,8]], 
[[1,4,1],[1,2,10],[9,3,1]], 
[[1,4,0],[1,4,9],[2,5,8]], 
] 


print [[cell[0] for cell in row] for row in dataset] 
2
import numpy as np 
np.array(dataset).reshape(3,9) 

возвращается

array([[ 2, 3, 1, 1, 2, 9, 1, 3, 8], 
     [ 1, 4, 1, 1, 2, 10, 9, 3, 1], 
     [ 1, 4, 0, 1, 4, 9, 2, 5, 8]]) 

второго:

np.array(dataset)[:,:,0] 

возвращает

array([[2, 1, 1], 
     [1, 1, 9], 
     [1, 1, 2]]) 
+0

Интересная альтернатива. Спасибо за tipp, так как я тоже вяжусь. –

Смежные вопросы