作者x94fujo6 ()
看板Python
标题Re: [问题] 多个list快速比对
时间Sun Sep 13 14:37:17 2020
※ 引述《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://webptt.com/cn.aspx?n=bbs/Python/M.1599979039.A.7B1.html
※ 编辑: x94fujo6 (114.33.176.49 台湾), 09/13/2020 14:54:12
1F:推 oneonesix: 谢谢大大分享 09/14 06:02