2016-11-28 3 views
4

У меня есть переменная длина многомерной как следующее:нарезка многомерного списка

listD = [[[[53, 54], [129, 130]]], 
    [[[51, 51], [132, 132]]], 
    [[[39, 39], 
     [144, 144]], 
     [[53, 54], 
     [129, 130]]], 
    [[[39, 39], [146, 146]], [[54, 54], [130, 130]]], 
    [[[54, 53], [130, 129]]], 
    [[[52, 52], [132, 132]]] 
    ] 

Мне нужно, чтобы выбрать первый элемент в каждом из сокровенных списков. Вывод должен выглядеть следующим образом:

outlist=[[[[53, 54]]], 
    [[[51, 51]]], 
    [[[39, 39]], 
     [[53, 54]]], 
    [[[39, 39]], 
     [[54, 54]]], 
    [[[54, 53]]], 
    [[[52, 52]]] 
    ] 

Я пытаюсь нарежьте с помощью 0 и: S, я не получаю правильный список обратно. Как это сделать в python?

Я сделал ошибку в моем списке. Я редактировал список. Извините за путаницу.

+3

пожалуйста, покажите, что вы делали до сих пор. –

+2

Если вы хотите избежать понимания списка, вы можете посмотреть в numpy ... – Shadowen

+0

Я бы хотел использовать список. До сих пор я пытался использовать 'outlist = [listD [n] [:, 0 ,:] для n в диапазоне (8)]' после преобразования списка в массив. Это дает мне ошибку типа, что я использую кортеж вместо целого числа для индекса. Ошибка имеет смысл, но я не знаю, как ее исправить. –

ответ

-1

вы можете использовать:

temp=[item for sublist in listD for item in sublist] 
flatten=[item for sublist in temp for item in sublist]  
[flatten[int(i*2)] for i in xrange(int(len(flatten)/2))] 

получить:

[[53, 54], 
[51, 51], 
[39, 39], 
[53, 54], 
[39, 39], 
[54, 54], 
[54, 53], 
[52, 52]] 

или:

[[[flatten[int(i*2)]]] for i in xrange(int(len(flatten)/2))] 

, чтобы получить его вложен как вы написали.

+0

сплющенный список не работает, так как моя последующая операция должна получить Индекс конкретного элемента - это список сторон. Список сильно изменен, внутренний список может быть 2 или 3 или 5 или n длинным. –

-1

Попробуйте это:

res_list = [] 

for item in listD: 
    sub_list = [] 
    for i in item: 
     sub_list.append([i[0]]) 
    res_list.append(sub_list) 

Выход:

>>> res_list 
[[[[53, 54]]], [[[51, 51]]], [[[39, 39]], [[53, 54]]], [[[39, 39]], [[54, 54]]], [[[54, 53]]], [[[52, 52]]]] 

С списка понимания, вы можете попробовать:

res_list = [[[i[0]] for i in item] for item in listD] 
+0

Могу ли я понять, почему downvote? – ettanany

1

Попробуйте с вложенным списком понимания:

[[[x[0]] for x in y] for y in listD] 

На этапах:

Посмотрите на каждой вложенной строки в вашем listD и посмотреть, как это соответствует outlist. Вы можете видеть, что первый элемент каждого из 1-глубокий список включен в outlist

>>> [x[0] for x in listD[0]] 
[[53, 54]] 
>>> [x[0] for x in listD[1]] 
[[51, 51]] 
>>> [x[0] for x in listD[2]] 
[[39, 39], [53, 54]] 

Но в outlist эти списки затем вложены в еще один список 1-элемент, так оберните каждый из них в это собственный список, например, следующий элемент будет:

>>> [[x[0] for x in listD[3]]] 
[[[39, 39], [54, 54]]] 

затем расширить его для каждого индекса listD:

[[[x[0]] for x in listD[i]] for i in range(len(listD))] 

затем упростить далее replacin г listD[i] только с элементами listD:

[[[x[0]] for x in y] for y in listD] 
+0

Почему downvote? Учитывая 'listD' в вопросе, этот ответ дает точный' outlist' ... – Billy

+0

Не уверен, кто голосует, это очень помогает мне. Спасибо –

+0

Добро пожаловать - и примите кнопку == спасибо. – Billy

1

Неясно, имеет ли ваш список списков одинаковую глубину или нет. Если это переменная глубина, вы лучше всего подходите к ней рекурсивно.

Дано:

>>> listD = [[[[53, 54], [129, 130]]], 
...  [[[51, 51], [132, 132]]], 
...  [[[39, 39], 
...  [144, 144]], 
...  [[53, 54], 
...  [129, 130]]], 
...  [[[39, 39], [146, 146]], [[54, 54], [130, 130]]], 
...  [[[54, 53], [130, 129]]], 
...  [[[52, 52], [132, 132]]] 
...  ] 
>>> 
>>> outlist=[[[[53, 54]]], 
...  [[[51, 51]]], 
...  [[[39, 39]], 
...  [[53, 54]]], 
...  [[[39, 39]], 
...  [[54, 54]]], 
...  [[[54, 53]]], 
...  [[[52, 52]]] 
...  ] 

Вы можете рекурсивно пройти список списков до тех пор, пока не найдете список, который не имеет списков в первом элементе. Держи это. В противном случае увеличьте вложенность.

Пример:

def trav(x): 
    result = [] 
    for el in x: 
     if isinstance(el, list) and any(isinstance(e, list) for e in el[0]): 
      result.append(trav(el)) 
     else: 
      result.append([el[0]]) 
    return result 


>>> trav(listD) 
[[[[53, 54]]], [[[51, 51]]], [[[39, 39]], [[53, 54]]], [[[39, 39]], 
[[54, 54]]], [[[54, 53]]], [[[52, 52]]]] 
>>> trav(listD)==outlist 
True 
+0

Почему голос? – dawg

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