2013-11-30 2 views
0

Мое название, вероятно, невероятно запутанно, поэтому я просто приведу пример. Для следующего списка:Создать список из определенного элемента подписок

x = [ [1,2,3], [4,5,6], [7,8,9] ] 

Итак, если вы хотите от индекса один результирующий список будет:

[2,5,8] 

Есть короткий способ сделать это? Очевидно, вы можете проходить через внешний список и просто захватывать каждый элемент индекса 1, но есть ли какой-либо простой способ сделать это в одной строке, например, с помощью нотации slce?

Я знаю, что это возможно сделать это в одной строке с чем-то вроде:

list(map(lambda f : f[1], x)) 

Но это именно то, что я описал выше (только с помощью неявного цикла).

Если это помогает, можно с уверенностью предположить, что все элементы будут индексируемыми.

+0

Вы знаете, что даже в срезах есть неявный цикл :) –

+1

Так ** ** почему вы хотите сделать это без (явный или неявный) цикл? И как это должно быть возможно - машина должна перебирать последовательность в той или иной точке, чтобы сделать это. –

+0

Я не сказал, что хотел это сделать. Это так же, как я сказал - «есть ли способ». Мне было любопытно, поэтому я спросил. – Kevin

ответ

3

Независимо от того, что вы делаете, будет всегда быть где-то неявным.

Вы можете также использовать zip (смотреть ма без петель (без for ключевых слов)!):

>>> zip(*x)[0] 
(1, 4, 7) 
>>> zip(*x)[1] 
(2, 5, 8) 
>>> zip(*x)[2] 
(3, 6, 9) 

Или списочные:

>>> x = [ [1,2,3], [4,5,6], [7,8,9] ] 
>>> l = [var[1] for var in x] 
>>> l 
[2, 5, 8] 

Если вы хотите какой-то другой индекс:

>>> [var[0] for var in x] 
[1, 4, 7] 
>>> [var[2] for var in x] 
[3, 6, 9] 
+0

«Но это именно то, что я описал выше (просто используя неявный цикл)». Однако, поскольку у вопроса нет ответа, который передает это ограничение, я буду повышать. –

+0

@MihaiMaruseac: код, который работает с произвольными списками, не сможет выполнить такое требование. Честно говоря, если одно из ваших требований при работе со списками «не должно иметь неявный цикл», вы должны снова подумать об этих требованиях. – Femaref

+0

@MihaiMaruseac Я добавил версию с 'zip', dunno, если ее быстрее или что-то еще. –

0

Чтобы прямо указать ваш массив таким образом, вы можете использовать numpy.array. Затем вы можете использовать нотацию фрагмента.

2
In [3]: x = [ [1,2,3], [4,5,6], [7,8,9] ] 

In [4]: import operator 

In [5]: map(operator.itemgetter(1), x) 
Out[5]: [2, 5, 8] 
+0

Я думаю, что моя версия 'zip' умнее! : D –

+0

Хорошо для вас! :) Но есть две проблемы с zip-версией: для большей работы требуется больше памяти, чем необходимо, если внутренние списки длинны, и она вызывает IndexError, если список пуст: 'zip (* []) ​​[1] '. – unutbu

+0

Ты просто украл мой гром, ты очень много! : P В любом случае +1. –

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