假設我有這樣一個元組:查找在一個元組元素,並篩選他們
[('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')]
我想篩選出的名單,併產生一個新的有與「IMG」開頭的元素。所以我的新列表將如下所示:
[('img-1','iii'), ('img-2','jjj')]
謝謝!
假設我有這樣一個元組:查找在一個元組元素,並篩選他們
[('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')]
我想篩選出的名單,併產生一個新的有與「IMG」開頭的元素。所以我的新列表將如下所示:
[('img-1','iii'), ('img-2','jjj')]
謝謝!
方式一:
>>> l = [('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')]
>>> [t for t in l if t[0].startswith('img')]
[('img-1', 'iii'), ('img-2', 'jjj')]
另一種方式:
>>> filter(lambda x: x[0].startswith('img'), l)
[('img-1', 'iii'), ('img-2', 'jjj')]
首先是所謂的清單理解。有關相關技術,請參閱F.C.'s answer。基本語法是[{expression} for {item_var_or_vars} in {iterable} if {boolean_expression}]
。這是語義上等同於這樣的事情:
new_list = []
for {item_var_or_vars} in {iterable}:
if {boolean_expression}:
new_list.append({expression})
的if {boolean_expression}
位是可選的,只是因爲它是在for循環。
第二個是簡單的內置函數filter
,它接受一個測試函數和一個可迭代的函數,並返回一個包含「傳遞」測試函數的每個元素的列表。 lambda
,如果您以前沒有看過,只是定義函數的一種快速方法。你可以這樣做,而不是:
def keep_this_element(element):
return element[0].startswith('img') # returns True for ('img...', '...')
new_list = filter(keep_this_element, l) # keeps only elements that return True
只是另一種方式與generator expression(它可以使大名單差一些)
>>> l = [('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')]
>>> (x for x in l if x[0].find('img') == 0)
0: <generator object <genexpr> at 0x917a00>
>>> gen = (x for x in l if x[0].find('img') == 0)
>>> list(gen)
1: [('img-1', 'iii'), ('img-2', 'jjj')]
tuple_filter = lambda t, i, w: filter(lambda a: a[i].startswith(w), t)
newtuple = tuple_filter(thetuple, 0, 'img')
這太好了。這兩種技術有沒有名字?我想更多地閱讀這些方法。謝謝。 – sidewinder
@Awais,請參閱我的編輯以獲取更詳細的解釋。 – senderle
第一個是[list comprehension](http://docs.python.org/tutorial/datastructures.html#list-comprehensions)第二個是[filter](http://docs.python.org/library/functions .html#filter)和[lambda表達式](http://docs.python.org/reference/expressions.html#lambda) – agf