2016-11-28 10 views
4

Slicing habe ich eine variable Länge multidimensional wie die folgenden:eine mehrdimensionale Liste

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]]] 
    ] 

Ich brauche das erste Element in jedem der innersten der Listen auszuwählen. Die Ausgabe sollte wie folgt aussehen:

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

I mit 0 und in Scheiben schneiden versuchen: s, ich bin nicht die richtige Liste immer wieder. Wie macht man das in Python?

Ich hatte einen Fehler in meiner Out-Liste gemacht. Ich habe die Liste bearbeitet. Entschuldigung für die Verwirrung.

+3

bitte zeigen, was Sie bisher getan haben. –

+2

Wenn Sie Listenverständnis vermeiden wollen, möchten Sie vielleicht in numpy suchen ... – Shadowen

+0

Ich möchte List Verständnis verwenden. Bisher habe ich versucht, 'outlist = [listD [n] [:, 0 ,:] für n in Bereich (8)]' nach dem Konvertieren der Liste in Array zu verwenden. Dies gibt mir einen Typfehler, dass ich ein Tupel anstelle einer Ganzzahl für Index verwende. Der Fehler macht Sinn, aber ich weiß nicht, wie ich das beheben soll. –

Antwort

-1

können Sie:

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))] 

zu erhalten:

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

oder:

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

es bekommen verschachtelt wie Sie geschrieben haben.

+0

abgeflachte Liste funktioniert nicht, wie meine nachfolgende Operation erhalten muss Index eines bestimmten Artikels ist die In-Side-Liste. Die Liste ist sehr variabel, die innere Liste kann 2 oder 3 oder 5 oder n lang sein. –

-1

Versuchen Sie folgendes:

res_list = [] 

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

Ausgang:

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

Mit Liste Verständnis, können Sie versuchen:

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

Kann ich verstehen, warum der Downvote? – ettanany

1

Versuchen mit verschachtelten Liste Verständnis:

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

In den Schritten:

Blick auf jede verschachtelte Zeile in der listD und sehen, wie es zu outlist entspricht. Sie können sehen, dass das erste Element jedes der 1-Tief Liste in outlist enthalten ist

>>> [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]] 

Aber in outlist werden diese Listen dann in einer weiteren 1-Elementliste verschachtelt, so wickeln jede dieser in es ist eine eigene Liste, zum Beispiel das nächste Element wäre:

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

es dann für jeden Index von listD erweitern:

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

dann weiter vereinfachen, indem replacin g listD[i] nur mit den Elementen der listD:

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

Warum der Downvote? Angesichts der 'listD' in der Frage, gibt diese Antwort die genaue 'outlist' ... – Billy

+0

Nicht sicher, wer unten abstimmt das, das hilft mir sehr. Danke –

+0

Gern geschehen - und akzeptieren Button == Danke. – Billy

1

Es ist unklar, ob die Liste der Listen einheitliche Tiefe hat oder nicht. Wenn es eine variable Tiefe ist, nähern Sie sich am besten rekursiv.

Gegeben:

>>> 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]]] 
...  ] 

Sie können die Liste von Listen rekursiv durchlaufen, bis Sie eine Liste finden, die keine Listen in das erste Element hat. Behalte das. Andernfalls erhöhen Sie die Verschachtelung.

Beispiel:

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

Warum die down vote? – dawg

Verwandte Themen