Re: [問題] 多個list快速比對
※ 引述《oneonesix (小當家)》之銘言:
: 例
: A= [1,2,3,4]
: B= [5,6,7,8]
: C= [1,3,4,5,7]
: 然後我需要A和C比對,
: 如果一樣就顯示相對於A同位置的B,
: A和B的個數都是一樣的
: 例如
: A[3] = C[2] ,然後顯示B [3]
: 小弟目前只會笨笨的用迴圈去比對,
: 但是資料量一大的話就會很久
: 請問有大大有更好的方法嗎?
: 例
: for i,j in zip(A,B):
: for k in C:
: If i==k:
: Print(j)
: -----
: Sent from JPTT on my iPhone
閒著玩一下,不過不清楚是效能還是笑能XD
==============================================
enumerate
歷遍A同時產生index,用index取出對應的B
for index, a in enumerate(A, start=0):
if a in C:
print(B[index])
結果:
5
7
8
==============================================
單行化
new_list = list(B[index] for index, a in enumerate(A, start=0) if a in C)
print(new_list)
結果:
[5, 7, 8]
==============================================
map+lambda
跟上面差不多,只是想試試map,結果好像不太適合
new_list = list(map(lambda a, b: b if a in C else None, A, B))
print(new_list)
結果:
[5, None, 7, 8]
這個if必須要有else,我又找不到Null的方式
也不能pass/continue來跳過,只能用None
失敗
==============================================
filter+lambda
改用filter
但是好像只能接1個iterable,只好zip成單個x
x[0]=a, x[1]=b
回傳x (依然是zip的A跟B)
new_list = list(filter(lambda x: x[0] in C, zip(A, B)))
print(new_list)
結果:
[(1, 5), (3, 7), (4, 8)]
--------------------------
unzip
new_list = list(zip(*new_list))
print(new_list)
結果:
[(1, 3, 4), (5, 7, 8)]
--------------
A 跟 B
filtered_A, filtered_B = new_list
print("new_list[0]={}, new_list[1]={}".format(filtered_A, filtered_B))
結果:
new_list[0]=(1, 3, 4), new_list[1]=(5, 7, 8)
==============================================
單行化
new_list = list(zip(*filter(lambda x: x[0] in C, zip(A, B))))[1]
print(new_list)
結果:
(5, 7, 8)
用底線忽略A,結果一樣
_, new_list = zip(*filter(lambda x: x[0] in C, zip(A, B)))
https://i.imgur.com/0fdmpKt.jpg

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.33.176.49 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1599979039.A.7B1.html
※ 編輯: x94fujo6 (114.33.176.49 臺灣), 09/13/2020 14:54:12
推
09/14 06:02,
4年前
, 1F
09/14 06:02, 1F
討論串 (同標題文章)
Python 近期熱門文章
PTT數位生活區 即時熱門文章