Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Kita Boleh Menjana Set Kuasa Set Diberi dengan Cekap?

Bagaimanakah Kita Boleh Menjana Set Kuasa Set Diberi dengan Cekap?

DDD
DDDasal
2024-12-05 06:15:11568semak imbas

How Can We Efficiently Generate the Powerset of a Given Set?

Penjanaan Powerset: Pendekatan Elegan

Soalan:
Memandangkan satu set, bagaimana kita boleh mengira dengan cekap set kuasa, yang merangkumi semua kemungkinan subset asal set?

Jawapan:
Modul itertools serba boleh Python menawarkan penyelesaian yang luar biasa untuk penjanaan set kuasa, seperti yang ditunjukkan di bawah:

from itertools import chain, combinations

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

Penjelasan:

  • Fungsi ini dinamakan "powerset" berfungsi dengan objek boleh lelar.
  • Kod merentasi julat integer daripada 0 hingga kepanjangan boleh lelar tambah 1.
  • Untuk setiap integer, ia menjana gabungan unsur daripada boleh lelar, di mana bilangan elemen yang dipilih sejajar dengan integer semasa.
  • Fungsi "rantai" daripada itertools digunakan pada gabungkan gabungan ini menjadi satu lelar tunggal yang mewakili set kuasa.

Output:
Apabila kita menggunakan fungsi set kuasa ini kepada boleh lelar yang mengandungi unsur "abcd", ia menghasilkan mengikuti set kuasa:

[(), ('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 tuple kosong awal dalam output tidak diingini, ubah sahaja pernyataan julat untuk menggunakan julat 1 kepada panjang boleh ulang tambah 1, dengan berkesan mengecualikan gabungan kosong daripada set kuasa.

Atas ialah kandungan terperinci Bagaimanakah Kita Boleh Menjana Set Kuasa Set Diberi 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