Làm thế nào để chuyển đổi danh sách lồng nhau thành một danh sách duy nhất trong python? [đóng cửa]


7

Tôi có một danh sách chứa số id. Một số yếu tố của danh sách là một danh sách khác. Để chuyển đổi danh sách lồng nhau thành một danh sách, tôi viết hàm đệ quy bằng mô đun bộ sưu tập.

Mã của tôi đang theo dõi.

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)

Khi tôi chạy chương trình của mình, tôi nhận được thông báo lỗi sau.

  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

Tôi không biết làm thế nào để sửa lỗi.


Đây không phải là một câu hỏi khoa học dữ liệu và do đó nên được đóng hoặc chuyển sang StackOverflow. Xem mpu.datastructures.flatten(yourlist)như là một giải pháp cho vấn đề - bạn cũng có thể nhìn vào việc thực hiện.
Martin Thoma

Câu trả lời:


7

Bạn đang gặp lỗi vì giá trị chuỗi chứa trong danh sách lồng nhau. Bạn cần phải xử lý giá trị chuỗi là tốt.

Bạn có thể sửa lỗi bằng các mã sau:

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)

Tôi vui vì nó đã giúp.
Rejaul Karim

2

Câu hỏi của bạn tập trung vào việc làm phẳng một danh sách. Câu hỏi này đã được trả lời tốt trên StackOverflow, hãy xem Tạo một danh sách phẳng trong danh sách các danh sách trong Python

Đây là câu trả lời của riêng tôi về chủ đề đó, mặc dù nó có thể không phải là câu trả lời tốt nhất.

Gần đây tôi đã gặp một tình huống mà tôi có sự kết hợp của chuỗi và dữ liệu số trong danh sách phụ, chẳng hạn như

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

nơi mà các phương pháp như flat_list = [item for sublist in test for item in sublist]đã không làm việc. Vì vậy, tôi đã đưa ra giải pháp sau đây cho hơn 1 cấp độ danh sách phụ

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

Và kết quả

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

Bạn có thể thử phương pháp dưới đây. Nested_list = Là danh sách của bạn mà bạn muốn chuyển đổi.

Mã số:

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

Mã trên giống như dưới đây:

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

Cảm ơn!


Cảm ơn sự hỗ trợ của bạn. Tuy nhiên, tôi nhận được thông báo lỗi như TypeError: đối tượng 'int' không thể lặp lại từ giải pháp của bạn.
Younus Ali
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.