Tugas meratakan senarai senarai bersarang boleh menjadi mencabar, terutamanya apabila sarang tidak teratur. Soalan yang dikemukakan menyiasat keberkesanan algoritma perata berikut:
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, soalan itu juga menimbulkan kemungkinan pendekatan alternatif menggunakan fungsi penjana.
Fungsi berasaskan penjana boleh memudahkan proses merata dan berpotensi meningkatkan prestasi. Berikut ialah contoh untuk Python 2 dan 3:
Menggunakan Iterable ABC yang diperkenalkan dalam Python 2.6:
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
In Python 3, jenis rentetan asas tidak lagi ada, dan tuple (str, bait) boleh digunakan sebaliknya. Selain itu, hasil daripada operator memudahkan lelaran ke atas penjana:
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
Pendekatan berasaskan penjana mempunyai kelebihan untuk menjadi lebih ringkas dan berpotensi lebih cekap, kerana ia mengelakkan senarai perantaraan dan mengumpulkan keputusan langkah demi langkah .
Atas ialah kandungan terperinci Bagaimanakah Senarai Bersarang Tidak Teratur Boleh Diratakan dengan Cekap dalam Python Menggunakan Pendekatan Rekursif dan Berasaskan Penjana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!