Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Penjana Python Boleh Meratakan Senarai Bersarang Sewenang-wenangnya Dengan Cekap?

Bagaimanakah Penjana Python Boleh Meratakan Senarai Bersarang Sewenang-wenangnya Dengan Cekap?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-21 15:02:09694semak imbas

How Can Python Generators Efficiently Flatten Arbitrarily Nested Lists?

Meratakan Senarai Tidak Teratur dengan Penjana Python

Masalah meratakan senarai senarai yang bersarang secara sewenang-wenangnya adalah perkara biasa, tetapi penyelesaian sedia ada sering gagal secara mendalam struktur bersarang. Khususnya, senarai seperti [[[1, 2, 3], [4, 5]], 6] tidak boleh diratakan menggunakan kebanyakan penyelesaian.

Fungsi berikut, berdasarkan penyelesaian daripada soalan lain, boleh meratakan senarai sedemikian dengan berkesan:

def flatten(x):
    result = []
    for el in x:
        if hasattr(el, "__iter__") and not isinstance(el, basestring):
            result.extend(flatten(el))
        else:
            result.append(el)
    return result

Walau bagaimanapun, sementara fungsi ini berfungsi, ia boleh dipertingkatkan dari segi kebolehbacaan dan prestasi menggunakan penjana berfungsi.

Python 2 dengan Iterable ABC

from collections import Iterable

def flatten(xs):
    for x in xs:
        if isinstance(x, Iterable) and not isinstance(x, basestring):
            for item in flatten(x):
                yield item
        else:
            yield x

Python 3 dengan Iterable ABC dan Hasil Daripada

from collections.abc import Iterable

def flatten(xs):
    for x in xs:
        if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
            yield from flatten(x)
        else:
            yield x

Penyelesaian berasaskan penjana ini menyediakan cara yang lebih ringkas dan cekap untuk meratakan yang tidak teratur senarai. Mereka berfungsi dengan mengulangi setiap elemen dalam senarai dan secara rekursif menghasilkan elemen untuk subsenarai. Sebarang unsur yang tidak boleh diulang (cth., nombor atau rentetan) akan dihasilkan dengan serta-merta.

Atas ialah kandungan terperinci Bagaimanakah Penjana Python Boleh Meratakan Senarai Bersarang Sewenang-wenangnya Dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn