簡體   English   中英

這個 function 在 Python 中創建 PowerSet 是如何工作的?

[英]How does this function to create a PowerSet in Python works?

我正在尋找一種不使用模塊在 Python 中創建電源組(一組的所有可能子集)的方法。

我在網上找到了很多方法。 僅在這個論壇就有很多答案。 但是,盡管所有代碼都能正常工作,但我找不到能夠理解代碼在做什么的答案。 我是 Python 的新手,我的主要目標是學習而不是找到合適的代碼。

有人可以向我解釋以下代碼如何生成子集列表嗎?

def powerset(s):
    x = len(s)
    for i in range(1 << x):
        print [s[j] for j in range(x) if (i & (1 << j))]

powerset([4,5,6])

Output

[]
[4]
[5]
[4, 5]
[6]
[4, 6]
[5, 6]
[4, 5, 6]

我真的不明白也找不到的是:

range(1 << x)
if (i & (1 << j))

但總的來說,我不知道這段代碼在做什么。

作為旁注,X 的冪集在數學文獻中通常表示為 2^X。 如果集合 X 中有 N 個元素,則冪集的大小為 2^N。

生成冪集的一種方法是通過 bitmap:假設您有 N 個元素布置為大小為 N 的數組,並且您枚舉從 0 到 2^N-1 的所有整數並將它們以二進制形式寫入,然后每個元素的冪set 是根據每個二進制數從數組中選取的子集。

例如,如果你有[4, 5, 6]並且你枚舉 0 到 7=2^3-1,你有這些數字和相應的子集:

0 = 000 -> []
1 = 001 -> [6]
2 = 010 -> [5]
3 = 011 -> [5, 6]
...
6 = 110 -> [4, 5]
7 = 111 -> [4, 5, 6]

要將其轉換為代碼,您會注意到以下內容:

  • 2^N 等於1 << N ,即將 1 的二進制表示左移 N 位
  • 如果你有一個二進制數x ,要檢查右邊的 position j是否為 1,你做x & (1 << j) ; 其中1 << j是將 1 移位 j 位並且&是二進制與運算,因此當且僅當x的位 j 不為 1 時,與的結果為 0

因此你有你的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM