2016-05-18 1 views
0

Ich muss ein Objekt analysieren, das aus Listen besteht. Aber es kann Liste innerhalb der Liste innerhalb der Liste haben: obj=[[smth1],[[smth2],[smth3]]] jede smthX kann auch eine Liste sein.Was sollte ich anstelle von isinstance() verwenden

Ich bin auf der Suche nach einem Wert, den ich weiß, ist in einer "Second-Layer-Liste". In meinem Beispiel könnte es sein in [[smth2],[smth3]]

Was ich gerade mache ist auf meinem Objekt iterieren, und testen, ob was ich Iterate auf eine Liste awell bin. Wenn es so ist, suche ich nach meinem Wert.

for list in obj : 
    if isinstance(list, obj) : 
     for souslist in list : 
     I LOOK FOR MY VALUE 

Aber ich bin überall (http://canonical.org/~kragen/isinstance/ viele Stackoverflow Thread) zu lesen, dass die Verwendung von isinstance() nur für besondere Anlässe ist (und meine Verwendung sieht nicht aus wie ein besonderes Ereignis)

Vor der Verwendung isinstance() Ich habe getestet, welche Liste [0] mich in einem Versuch/außer mir zurück gab, aber es fühlte sich sogar falsch an. Irgendein alternativer Weg, um dies sauber zu erreichen? (Ich habe keine Macht über das Format meiner obj Ich muss daran arbeiten)

+2

Ihre Nutzung von 'isinstance' mir scheint in Ordnung, eigentlich. 99% meiner eigenen 'isinstance'-Verwendung ist, wenn ich eine Sammlung heterogener Typen durchsuche, was genau das ist, was Sie hier tun. (Ich poste dies als Kommentar und nicht als Antwort, weil es nur meine Meinung ist.) – Kevin

+0

Was meinst du genau mit * Second Layer List *? Wenn Sie die Objekte mit 2 verschachtelten Listen finden möchten, können Sie dies nicht in der ersten Schleife erreichen. – Kasramvd

+0

Es ist nichts falsch daran, 'isinstance' in Ihrem Fall zu verwenden. Deine erste Herangehensweise war auch in Ordnung, da Python an "leichter um Vergebung als um Erlaubnis bitten" glaubt: https://docs.python.org/3.4/glossary.html#term-eafp – DeepSpace

Antwort

1

Wenn Sie nach Unterlisten mit zwei Artikel suchen (die Listen sind) zuerst aus müssen Sie die Länge überprüfen (wenn Sie sicher sind, dass alle Elemente Liste sind), dann prüfen Sie, ob alle Elemente in Unterliste sind Liste mit isinstance()

for sub in obj: 
    if len(sub) == 2 and all(isinstance(i, list) for i in sub): # you can add " and isinstance(sub, list)" if you are not sure about the type of sub 
     look_val(sub) 
Verwandte Themen