Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Menjana Semua Subset (Powerset) Set Diberi dengan Cekap dalam Python?

Bagaimanakah Saya Boleh Menjana Semua Subset (Powerset) Set Diberi dengan Cekap dalam Python?

Linda Hamilton
Linda Hamiltonasal
2024-12-04 02:15:11648semak imbas

How Can I Efficiently Generate All Subsets (Powerset) of a Given Set in Python?

Mencari Semua Subset Set: Powerset

Memandangkan set elemen, mencari semua subsetnya boleh menjadi tugas pengaturcaraan biasa . Ini dikenali sebagai membina set kuasa set.

Penyelesaian Menggunakan itertools

Modul Python itertools menyediakan penyelesaian yang elegan untuk mengira set kuasa menggunakan kombinasi:

from itertools import chain, combinations

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

Bagaimana ia Berfungsi

Fungsi ini menjana semua gabungan elemen dalam set, daripada set kosong kepada set penuh. Ia mencapai ini dengan mengulang julat saiz subset yang mungkin (0 kepada bilangan elemen dalam set) dan mencipta gabungan elemen untuk setiap saiz.

Contoh

Sebagai contoh, set kuasa set {0, 1, 2, 3} ialah:

list(powerset("abcd"))
[(), ('a',), ('b',), ('c',), ('d',), ('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd'), ('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'd'), ('b', 'c', 'd'), ('a', 'b', 'c', 'd')]

Penyesuaian

Jika anda ingin mengecualikan subset kosong daripada set kuasa, anda boleh mengubah suai pernyataan julat dalam fungsi set kuasa kepada julat(1 , len(s) 1):

def powerset(iterable):
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(1, len(s)+1))

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menjana Semua Subset (Powerset) Set Diberi dengan Cekap dalam Python?. 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