Python小技巧:判斷一個(gè)列表是否包含另一個(gè)列表的全部元素
你應(yīng)該遇到過(guò)需要判斷一個(gè)列表是否包含另一個(gè)列表的全部元素的場(chǎng)景吧。這種需求在實(shí)際工作中非常常見(jiàn),比如在數(shù)據(jù)篩選、列表匹配以及集合操作等。下面勇哥給大家分享三個(gè)日常使用到的小技巧。
方法一:使用all函數(shù)和生成器表達(dá)式
例如從一個(gè)大的數(shù)據(jù)列表中選取滿足特定條件的子集。勇哥舉個(gè)例子:我們需要從一個(gè)商品列表中篩選出庫(kù)存充足的商品:
def contains(list1, list2):
return all(item in list1 for item in list2)
# 篩選庫(kù)存充足的商品
product_list = [{'name': 'Apple', 'stock': 10}, {'name': 'Banana', 'stock': 5}, {'name': 'Orange', 'stock': 8}]
required_products = ['Apple', 'Banana']
if contains([product['name'] for product in product_list], required_products):
print("有庫(kù)存")
else:
print("有庫(kù)存不足的商品")
# 輸出 :有庫(kù)存
方法二:使用set函數(shù)和集合運(yùn)算
對(duì)兩個(gè)集合進(jìn)行操作,例如求并集、交集或差集,這種也是很實(shí)用且常用。再舉個(gè)栗子:判斷用戶的興趣愛(ài)好是否與某個(gè)活動(dòng)的標(biāo)簽相匹配:
# 1. 內(nèi)置函數(shù)
def contains(list1, list2):
return set(list2).issubset(set(list1))
# 2. 操作符
def contains2(list1, list2):
return set(list2) <= set(list1)
user_interests = ['籃球', '游泳', '登山', '音樂(lè)']
event_tags = ['籃球', '足球', '音樂(lè)']
if contains(user_interests, event_tags):
print("完全匹配")
else:
print("不完全匹配")
if contains2(user_interests, event_tags):
print("完全匹配")
else:
print("不完全匹配")
# 輸出: 不完全匹配
方法三:嵌套循環(huán)
有時(shí)候會(huì)遇到一些特殊的場(chǎng)景,比如:需要自定義復(fù)雜的條件判斷邏輯來(lái)判斷列表之間的關(guān)系,這時(shí)候用上面兩種方法不太方便,我們就可以遇事不決先循環(huán)一波試試了。最后一個(gè)栗子:判斷兩個(gè)任務(wù)列表的優(yōu)先級(jí)是否一致:
def list_contains(List1, List2):
if len(List1) != len(List2):
return False
for task1, task2 in zip(List1, List2):
if task1['priority'] != task2['priority']:
return False
return True
tasks_1 = [{'name': 'Task 1', 'priority': 1}, {'name': 'Task 2', 'priority': 2}]
tasks_2 = [{'name': 'Task 3', 'priority': 1}, {'name': 'Task 4', 'priority': 2}]
if list_contains(tasks_1, tasks_2):
print("兩個(gè)任務(wù)列表的優(yōu)先級(jí)一致")
else:
print("兩個(gè)任務(wù)列表的優(yōu)先級(jí)不一致")
# 輸出:優(yōu)先級(jí)一致
以上就是勇哥分享的三種簡(jiǎn)單實(shí)用的處理數(shù)據(jù)的思路及示例代碼,當(dāng)然如果小伙伴們遇到嵌套比較深可能需要全比對(duì)的數(shù)據(jù)或者更復(fù)雜的數(shù)據(jù)要處理的時(shí)候,就可以自由的擴(kuò)展方法或者另辟蹊徑了。