Como converter lista aninhada em uma única lista em python? [fechadas]


7

Eu tenho uma lista que contém o número de identificação. Alguns elementos da lista são outra lista. Para converter lista aninhada em uma única lista, escrevo uma função recursiva usando o módulo de coleções.

Meus códigos estão seguindo.

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)

Quando executo meu programa, recebo a seguinte mensagem de erro.

  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

Não sei como corrigir o erro.


Esta não é uma questão de ciência de dados e, portanto, deve ser fechada ou movida para o StackOverflow. Veja mpu.datastructures.flatten(yourlist)como uma solução para o problema - você também pode olhar para a implementação.
Martin Thoma

Respostas:


7

Você está recebendo o erro devido ao valor da sequência contido na lista aninhada. Você também precisa lidar com o valor da string.

Você pode corrigir o erro seguindo os códigos:

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)

Fico feliz que ajudou.
Rejaul Karim

2

Sua pergunta está focada em achatar uma lista. Esta pergunta foi bem respondida no StackOverflow, consulte Criando uma lista simples fora da lista de listas no Python

Aqui está minha própria resposta nesse tópico, embora possa não ser a melhor resposta.

Recentemente, deparei-me com uma situação em que eu misturava seqüências de caracteres e dados numéricos em sublistas como

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

onde métodos como flat_list = [item for sublist in test for item in sublist]não funcionaram. Então, eu vim com a seguinte solução para mais de 1 nível de sublistas

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

E o resultado

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

0

Você pode tentar o método abaixo. nested_list = É a sua lista que você deseja converter.

Código:

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

O código acima é o mesmo que abaixo:

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

Obrigado!


Obrigado por seu apoio. No entanto, recebo uma mensagem de erro como TypeError: o objeto 'int' não é iterável da sua solução.
Younus Ali
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.