1. 程式人生 > >python 實現求一個集合的子集

python 實現求一個集合的子集

不能 proc subset highlight 它的 scripts list lis 也有

概要

  今天偶然看到有個關於數學中集合的問題,就突發奇想的想用python實現下求一個集合的子集。

準備

  我當然先要復習下,什麽是集合,什麽是子集?

  比較粗獷的講法,集合就是一堆確定的東西,細致一點的講法呢,就是由一個或多個確定的元素所構成的整體,集合中的東西稱為元素。

  集合有一些特性:

  1.確定性

    給定一個集合,任給一個元素,該元素或者屬於或者不屬於該集合,二者必居其一,不允許有模棱兩可的情況出現。
  2.互異性
    一個集合中,任何兩個元素都認為是不相同的,即每個元素只能出現一次。有時需要對同一元素出現多次的情形進行刻畫,可以使用多重集,其中的元素允許出現多次。
  3.無序性
  一個集合中,每個元素的地位都是相同的,元素之間是無序的。集合上可以定義序關系,定義了序關系後,元素之間就可以按照序關系排序。但就集合本身的特性而言,元素之間沒有必然的序。

  集合也有些相關的概念:

  1.空集

    這類集合不包含任何元素,它是任何一個非空集合的真子集,同時它也是任何一個集合的子集。

  2.子集

    如果有兩個集合,S,T,對於S中的任何一個元素,都能在T中找到,那麽稱S是T的子集

  3.真子集

    如果有兩個集合,S,T,其中,S是T的子集,但是在T中存在元素不屬於S,那麽稱S是T的真子集。

例子

下面我們就舉個例子來具體說明下。

假設有集合 S=(a,b,c)

那麽它的子集是(a)(b)(c)(a,b)(a,c)(b,c)(a,b,c)()

真子集是 (a)(b)(c)(a,b)(a,c)(b,c)()

我們可以看出這樣一個規律(當然,簡單的通過這樣一個例子,好像並不能),就是假設集合中元素的個數是N,那麽它子集的個數是 2N

個,真子集的個數是2N-1個。

這個使我們根據定義通過主觀的意識去判斷的,通過代碼該如何實現呢?

python實現

之前聽到過一句話,talk is cheap,show me the code,說起來都是很簡單的,代碼實現呢?

上代碼之前,先簡單講一下這其中的一些算法,通過之前的講解,很容易就知道,對於一個集合中的元素,要麽在它的集合中,要麽不在,我們是不是可以利用0和1來表示,

比如上面的集合S,我們就來試一下,

(a) --> (100)=4

(b) --> (010)=2

(c) --> (001)=1

(a,b) --> (110)=6

(a,c) --> (101)=5

(b,c) --> (011)=3

(a,b,c)--> (111)=7

() --> (000)=0

是不是具有一定的規律?

我們就來實現下:

# -*- coding: utf-8 -*-

list_demo = [‘a‘, ‘b‘, ‘c‘]
sub_list_all = []  # 用於存放集合所有的子集
for i in range(1 << len(list_demo)):  # 循環遍歷0到2**n之間的每個數
    combo_list = []  # 用於存放每個單獨的循環中取出的子集
    for j in range(len(list_demo)):
        if i & (1 << j):  # 每一個數用&操作判斷改為上是否有1
            combo_list.append(list_demo[j])  # 有的話保存起來
    sub_list_all.append(combo_list)
print(len(sub_list_all))

  運行下:

E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/subsetCompute.py
[[], [‘a‘], [‘b‘], [‘a‘, ‘b‘], [‘c‘], [‘a‘, ‘c‘], [‘b‘, ‘c‘], [‘a‘, ‘b‘, ‘c‘]]

Process finished with exit code 0

python 實現求一個集合的子集