Wie konvertiere ich verschachtelte Listen in eine einzelne Liste in Python? [geschlossen]

7

Ich habe eine Liste, die ID-Nummer enthält. Einige Elemente der Liste sind eine andere Liste. Um verschachtelte Listen in eine einzelne Liste umzuwandeln, schreibe ich eine rekursive Funktion mit dem Sammlungsmodul.

Meine Codes folgen.

from collections import Iterable
def single_list(list):
for item in list:
    if isinstance(item, Iterable):
        yield from single_list(item)
    else:
        yield item

Item_list = [10,20,[30,40],[50,'Null',70],100]
items_single=single_list(Item_list)
for item in items_single:
print(item)

Wenn ich mein Programm starte, erhalte ich die folgende Fehlermeldung.

  Traceback (most recent call last):
  File "/Research/SoftDev/SEPJ/StackOverflow_qs.py", line 42, in <module>
  for i in items_single:
  File "/Research/SoftDev/SEPJ/StackOverflow_qs.py", line 36, in single_list
  yield from single_list(item)
  File "/Research/SoftDev/SEPJ/StackOverflow_qs.py", line 36, in single_list
  yield from single_list(item)
  File "/Research/SoftDev/SEPJ/StackOverflow_qs.py", line 36, in single_list
  yield from single_list(item)
  [Previous line repeated 986 more times]
  File "/Research/SoftDev/SEPJ/StackOverflow_qs.py", line 35, in single_list
  if isinstance(item, Iterable):
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/abc.py", line 184, in __instancecheck__
if subclass in cls._abc_cache:
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_weakrefset.py", line 75, in __contains__
return wr in self.data
 RecursionError: maximum recursion depth exceeded in comparison

 Process finished with exit code 1

Ich weiß nicht, wie ich den Fehler beheben soll.

Younus Ali
quelle
Dies ist keine datenwissenschaftliche Frage und sollte daher geschlossen oder in StackOverflow verschoben werden. Sehen Sie mpu.datastructures.flatten(yourlist)als Lösung für das Problem - Sie können sich auch die Implementierung ansehen.
Martin Thoma

Antworten:

7

Sie erhalten den Fehler, weil der Zeichenfolgenwert in der verschachtelten Liste enthalten ist. Sie müssen auch den Zeichenfolgenwert verarbeiten.

Sie können den Fehler durch folgende Codes beheben:

from collections import Iterable

def single_list(list,ignore_types=(str)): 
for item in list:
    if isinstance(item, Iterable) and not isinstance(item, ignore_types):
        yield from single_list(item,ignore_types=(str))
    else:
        yield item

Item_list = [10,20,[30,40],[50,'Null',70],100]
items_single=single_list(Item_list)
for item in items_single:
    print(item)
Rejaul Karim
quelle
Ich bin froh, dass es geholfen hat.
Rejaul Karim
2

Ihre Frage konzentriert sich auf das Reduzieren einer Liste. Diese Frage wurde in StackOverflow gut beantwortet, siehe Erstellen einer flachen Liste aus einer Liste von Listen in Python

Hier ist meine eigene Antwort auf diesen Thread, obwohl es möglicherweise nicht die beste Antwort ist.

Ich bin kürzlich auf eine Situation gestoßen, in der ich eine Mischung aus Zeichenfolgen und numerischen Daten in Unterlisten wie z

test = ['591212948',
['special', 'assoc', 'of', 'Chicago', 'Jon', 'Doe'],
['Jon'],
['Doe'],
['fl'],
92001,
555555555,
'hello',
['hello2', 'a'],
'b',
['hello33', ['z', 'w'], 'b']]

wo Methoden wie flat_list = [item for sublist in test for item in sublist]nicht funktioniert haben. Also habe ich die folgende Lösung für Unterlisten der Stufe 1+ entwickelt

def flattenList(data):
    results = []
    for rec in data:
        if isinstance(rec, list):
            results.extend(rec)
            results = flattenList(results)
        else:
            results.append(rec)
    return results

Und das Ergebnis

In [38]: flattenList(test)
Out[38]:
 Out[60]:
['591212948',
'special',
'assoc',
'of',
'Chicago',
'Jon',
'Doe',
'Jon',
'Doe',
'fl',
92001,
555555555,
'hello',
'hello2',
'a',
'b',
'hello33',
'z',
'w',
'b']
Jon
quelle
0

Sie können die folgende Methode ausprobieren. nested_list = Ist Ihre Liste, die Sie konvertieren möchten.

Code:

flat_list = [item for sublist in nested_list for item in sublist]

Der obige Code ist der gleiche wie unten:

for sublist in nested_list:
    for item in sublist:
        flat_list.append(item)

Vielen Dank!

Mannu
quelle
Danke für deine Unterstützung. Ich erhalte jedoch eine Fehlermeldung wie TypeError: Das Objekt 'int' kann von Ihrer Lösung nicht iteriert werden.
Younus Ali