[英]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]
要將其轉換為代碼,您會注意到以下內容:
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.