如何在python中将嵌套列表转换为单个列表?

数据挖掘 Python
2021-09-29 14:02:52

我有一个包含 ID 号的列表。列表中的某些元素是另一个列表。要将嵌套列表转换为单个列表,我使用集合模块编写了一个递归函数。

我的代码如下。

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)

当我运行我的程序时,我收到以下错误消息。

  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

我不知道如何修复错误。

3个回答

由于嵌套列表中包含字符串值,您会收到错误消息。您还需要处理字符串值。

您可以通过以下代码修复错误:

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)

您的问题集中在展平列表上。这个问题在 StackOverflow 上得到了很好的回答,请参阅Making a flat list out of list of lists in Python

这是我自己在该线程上的答案,尽管它可能不是最佳答案。

我最近遇到了一种情况,我在子列表中混合了字符串和数字数据,例如

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

像这样的方法flat_list = [item for sublist in test for item in sublist]没有奏效。因此,我为 1+ 级子列表提出了以下解决方案

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

结果

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

你可以试试下面的方法。nested_list = 是您要转换的列表。

代码:

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

上面的代码与下面相同:

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

谢谢!