python 列表解析與map和filter函式

2022-04-28 22:51:14 字數 1757 閱讀 5147

不知哪兒看到乙個說法,大概是當map的函式引數可以直接引用乙個已有的函式變數時(比如內建函式int,str之類的),用map更優美些,否則還是用列表解析更直觀和快速.

我同意此說法.

昨天在寫乙個函式時,最開始用的是map:

def

process_messages(arr,msgs,mode):

return map(lambda msg:process_message(arr,msg,mode),msgs)

可以看到,那個lambda顯得笨拙而龐大.今天起來轉念一想,用列表解析不是更好麼:

def

process_messages(arr,msgs,mode):

return [process_message(arr,msg,mode) for msg in msgs]

前段時間沒事的時候用python模擬map函式時發現,map函式的功能就是列表解析的子集..當時沒有用到zip函式,版本是這樣:

def imap(func,*seqs):

return (func(*(seq[i] for seq in seqs)) for i in range(len(seqs[0])))

今天突然發現zip函式原來是可以接受多個序列的,於是有了更優美的版本:

def imap(func,*seqs):

return [func(*args) for args in zip(*seqs)]

從上面的imap可以看到,列表解析完全可以涵蓋map的功能.當然,一些由於程式構造需要傳遞函式變數的情況,可能只能使用map.但這種的話總是可以改的.

而且,對於兩個或兩個以上的序列情況,map函式更繁雜:

map(lambda

arg1,arg2,...,argn:func(arg1,arg2,...,argn),seq1,seq2,...,seqn)

[func(*args) for args in zip(seq1,seq2,...,seqn)]

filer也有這樣的傾向:

def

clean_message(s):

return

''.join(filter(lambda

c:c.isalpha(),s.upper()))

defclean_message(s):

return

''.join(c for c in s.upper() if c.isalpha())

當然,以下這類情況用map,filter還是非常優美的:

string='

12345

'map(int,string)

numseqs=[(1,1,1,0),(1,1,1,1)]

filter(all,numseqs)

附,強大而靈活的zip函式和for迴圈.

>>> for k,v in [(1,2),(2,4)]:

print

k,v

1 22 4

>>> for k,v,x in [(1,2,3),(2,4,5)]:

print

k,v,x

1 2 3

2 4 5

>>> for k in [(1,2,3),(2,4,5)]:

print

k

(1, 2, 3)

(2, 4, 5)

>>>

python列表解析

列表解析是乙個列表對映出另乙個列表,它的基本形式是乙個方括號裡面包含乙個for語句對乙個iterable物件迭代 expression for target1 in iterable1 if condition1 for targetn in iterablen if conditionn 上面是列...

python 列表解析

m 1,2,3 4,5,6 7,8,9 col2 row 1 for row in m 獲取列表m的每個元素的第二個元素的值組成的列表 print col2 print row 1 1 for row in m 獲取列表m的每個元素的第二個元素 1的值組成的列表 print row 1 for ro...

Python列表解析

語法 1.expression for iter val in iterable 2.expression for iter val in iterable if cond expr l i 2 for i in range 1,11 print l 1,4,9,16,25,36,49,64,81,...