1. 程式人生 > >python中確定兩個列表(list)之間是否為子集關係

python中確定兩個列表(list)之間是否為子集關係

1. 將列表(list)轉換成集合(set)作比較

>>> A = [1,2,3,4,5]
>>> B = [1,2,3]
>>> C = [1,2,3,4,5]

>>> set(A) < set(B)      #A是B的真子集?False
False
>>> set(A) > set(B)      #B是A的真子集?True
True
>>> set(A) > set(C)      #C是A的真子集?False
False
>>> set(A
) >= set(C) #C是A的子集?True True

這種方法在某些情況下可能不適用,比如列表中有重複值的情況下:

>>> D = [1,2,3,4,4,4,5,5,5]
>>> print set(D)        #列表轉換成集合時會去重,在某些場景下需要考慮這個問題。
set([1, 2, 3, 4, 5])

除此之外,轉換成集合的形式,還可以做更多的操作,求交集、並集、差集等等。

2. 列表(list)通過邏輯操作比較

兩個列表 A 和 B,其中 A 與 B 中的一個元素存在,如下:

>>> 
A = [1,2,3] >>> B = [4,5,6,[1,2,3],7] >>> C = [1,2,3,4,5,6,7] >>> A in C False >>> A in B True >>> print B[3] [1, 2, 3]

A整體作為一個元素,也算是子集。只含有A這個列表的子集。

上面的方式算是個特例。
此外,還有一種方式可以實現:


>>> A = [1,2,3]
>>> B = [1,2,3,4,5,6]
>>> 
any([A==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1)]) True

我們來分析下這套語句的工作原理:

any([A==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1)])

由外向內分離,整體兩層
any()A==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1)

any(),只要其中任何一項為True就返回True。

>>> any([True,False,False])
True
>>> any([False,False,False])
False

A==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1),一個for迴圈的簡單寫法。

簡單套一下,可以知道迴圈B比A的列表長度長的次數,每次把B列表的切割和A列表作比較,看是否相等。所以上述步驟是這樣的。

>>> A = [1,2,3]      
>>> B = [1,2,3,4,5,6]
>>> [A==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1)]
[True, False, False, False]
>>> any([True, False, False, False])
True

我們理解這條語句是如何工作的之後,我們會發現一個問題就是當A列表和B列表的切片比對時,可能會發生因為順序不匹配導致無法認定為子集的情況,這顯然是不符合數學上的定義的。

>>> A = [1,2,3]      
>>> B = [1,4,3,2,5,6]
>>> any([A==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1)])
False

可以看到只是把B列表的順序改動了下,得到的是截然不同的結果。
所以在選擇方法時,需要根據實際情況來決定那種方式適合你的程式或指令碼。

相關推薦

python確定列表(list)之間是否子集關係

1. 將列表(list)轉換成集合(set)作比較 >>> A = [1,2,3,4,5] >>> B = [1,2,3] >>> C = [1,2,3,4,5] >>> set(A

Python 編寫程式,使用者輸入一個列表整數作為下標,然後使用切片獲取並輸出列表結餘下標之間的元素組成的子列表

編寫程式,使用者輸入一個列表和兩個整數作為下標,然後使用切片獲取並輸出列表中結餘兩個下標之間的元素組成的子列表。例如,使用者輸入 [1,2,3,4,5,6]和2,5,程式輸出[3,4,5] 練習題 2018.10.11 x = int(input("輸入下標下限:"))

Python - 列表(list)組成字典(dict)

使用 span script keys -m lin spa dict .text 使用zip函數, 把key和value的list組合在一起, 再轉成字典(dict). 代碼: # -*- coding: utf-8 -*- keys

Python程式碼比較列表的元素是否相等,並且返回相等元素的列表索引

list1 = [1,2,'a','b',5,67,78,99,"ji"] list2 = [1,"a","b",2,87,34,67,"ji"] for i in range(len(list1)): for j in range(len(list2)):

python交換變量值的方法

兩個 交換 print pri python post 方法 變量 class a = 4b = 5 #第1種c = 0c = aa = bb = c #第2種a = a+bb = a-ba = a-b #第3種a,b = b,a print("a=%d,b=%d"%(a,

Python 假設有列表 a=[‘name’,’age’,’sex’]和b=[‘Dog’,38,’Male’],請編寫程式將這列表的內容轉換字典

假設有列表 a=[‘name’,’age’,’sex’]和b=[‘Dog’,38,’Male’],請編寫程式將這兩個列表的內容轉換為字典,並且以列表a中的元素為“鍵”,以列表b中的元素為“值” 練習題 2018.10.11 d = {'a':1,'b':2} a = i

python交換變數

之前有段時間想用python寫個交換兩個變數的值的函式,我們知道在C++中是傳入兩個變數的指標或者引用,但是python中並沒有指標或者引用的概念,而且資源回收全部由python的執行環境接管了,要實現變數交換用函式實現反而麻煩了,直接a,b=b,a就把a和b的值交換了,

利用zip函式將列表(list)組成字典(dict)

使用zip函式, 把key和value的list組合在一起, 再轉成字典(dict). 程式碼: # -*- coding: utf-8 -*- keys = ['a', 'b', 'c']

shell, python比較日期的先後

在Shell中我們可以利用date命令比較兩個日期的大小,方法是先把日期轉換成時間戳格式,再進行比較。 date 的+%s可以將日期轉換成時間戳格式,看下面的例子: #!/bin/bash  date1="2008-4-09 12:00:00" date2="20

python】將列表合併字典,其中一個列表Key,一個列表Value

先說函式:dict(zip(列表1,列表2)) 列表1作為key,列表2作為value 下面看一下程式碼: #定義兩個列表 list1 = range(0,10) list2 = range(10,20) #合併為字典,呼叫dict(zip()) dict_name

python如何用序列(list())轉化矩陣(int())

今天練習寫python程式碼時,遇到一個有趣的寫法: def relu_fun(x): x[x<0]=0 return x 結合上下文發現x是矩陣,猜測函式功能是根據x的值若小於0,則對應位的x就置為0,否則直接返回原來x的值。

python列表實例如何相加或相減

array arr sharp pre sha 相減 例如 arp 相加 如下 import numpy a = [1, 2, 3, 4] b = [5, 6, 7, 8] a_array = numpy.array(a) b_array = numpy.ar

python列表升序合併並且去除列表重複元素的種方法

程式碼如下  l1 = [1,2,7,12,4,9,5] l2 = [5,1,10,11,2] l3 = l1 + l2 l3.sort() # print(set(l3)) #去除重複元素方法一 l4 = [] #去除重複元素方法二 for x in l3:

python 如何在一個for迴圈遍歷列表

#coding:utf-8 ################# # for迴圈兩個列表的過程 list1 = ['1', '1'] list2 = ['A','B'] for x in list1, list2: reslut = x[:] print reslut # type=

關於python求出列表的相同元素和不同元素

 用列表推導式來寫 list1 = [1,3,65,2,7] list2 = [3,2,5,4] c = [x for x in list1 if x in list2] d = [y for y in (list1+list2) if y not in c] prin

python 判斷列表相同和不同的元素

列表 直接 code 數據 返回 pytho style exce print 背景: 在做接口自動化時,通常會判斷接口返回中的數據信息,與數據庫中返回的數據信息是否一致,比如:將接口返回信息的用戶姓名存放到一個列表中,將數據庫返回的用戶姓名存放到另一個列表中,這時需要判斷

8.3 確定日期之間的工作日數目

one int form cas date_add ediff mat interval bsp 問題:給定兩個日期,求它們之間(包括這兩個日期本身)有多少個”工作“日。select sum(case when date_format(

python 列表復制給另一個列表,改值列表均會改變(備忘)

兩種 另一個 表復制 target tails details 總結 拷貝 get http://blog.csdn.net/lc_lc2000/article/details/53135839 本意是使A = B,B為一個列表,結果在後續對A的操作中,導致B中的值也改變了

8.05 確定日期之間的秒、分、小時數

max rom diff all red 日期 date edi cas select datediff(ward_hd,allen_hd)*24 hr, datediff(ward_hd,allen_hd)*24*60 min,

python 字符 字典 列表之間的轉換

png 列表 如果 asdasd 技術分享 com asd bsp 例如 1 字典 轉 字符 定義一個字典:dict = {‘name‘: ‘python‘, ‘age‘: 7}字典轉字符 可以使用str強制轉換 如: str(dict) 此時dict的類型就是字符型了