2014-03-24 18 views
1

我已經多次看過下面的代碼,我知道這是解決我的問題的方法,但我真的很難理解它是如何工作的。特別的代碼是:瞭解「item_list_a中的項目如果...」PYTHON

item for item in list_a if item not in list_b. 

例如,for each in list,我可以理解,它正在經歷的名單,並做了循環該列表中的每個項目。與while x < 10很容易理解,並且大多數其他循環和類似的命令是非常簡單的。即使是for item in list_a if item not in list_b對我來說也是有意義的,儘管沒有第一個item似乎並不奏效......但由於某些原因,我只是不明白第一個item如何適合等式,除了「因爲」(這不是一個有用的答案),它代表了什麼。

有人能幫我解決這個問題,或者能夠將這個方程式擴展到幾個方程式中,這可能會幫助我圍繞它的工作方式進行討論。當我瞭解他們的工作方式時,使用這些工具就變得容易多了,這讓我困惑了一陣子。

在此先感謝。

+1

http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions – Blender

回答

1

,如果你把它分解成三個部分可能是清晰的:

  1. 採取item;
  2. From for item in list;
  3. 其中item not in list_b

原因的列表中理解語法是這樣,這是因爲,首先反映了擴大版:

for item in list: # 2. 
    if item not in list_b: # 3. 
     new_list.append(item) # 1. 

,也因爲你不一定要只item,例如:

new = [x ** 2 for x in old if not x % 2] 

將創建一個new列表,其中包含所有偶數的正方形old

+0

重要的是要注意,返回的對象將是一個'list'而不是一個'item'。但這是對列表解析的一個很好的解釋! – CoryKramer

+0

謝謝。你的兩個故障填補了我完全缺失的部分,並使它更加合理。 – Kratch

-1

您是通過循環(過濾),另一個列表建立一個列表

的第一項事情你投入你的結果

你也可以做的東西的元素,如

[i*2 for i in range(6)] 

的輸出將是:

[0, 2, 4, 6, 8, 10] 

Essentiall y中的第一個「項目」讓您控制什麼,你把你的結果

+0

如果您使用實際的數據類型名稱(列表),那麼這個答案會更好,它甚至不包含理解中的條件。 –

+0

@ Two-BitAlchemist修復了數據類型。這個條件並不是他所要求的。他的重點是第一項,條件並不真正起作用。簡化有時會讓人更容易理解 – aha

0

列表內涵[item for item in list_a if item not in list_b]是等同於使用filter功能:

filter(list_a, lambda item: item not in list_b) 
0

首先,代碼你指的是被稱爲列表理解就行了。基本上,如您所知,這是一種創建「隨時隨地」項目列表的方式,並具備條件的能力。

當您創建列表理解時,您正在構建一個列表,並且您需要告訴Python您將放入列表中的內容。如果一個列表理解很乾脆:

new = [for item in list_a if item not in list_b] 

這不會是一個列表理解可言,因爲你只是迭代,而不是存儲在新的列表中的任何東西。因此,爲了實際的內容保存到新的列表中,您需要:

new = [item for item in list_a if item not in list_b] 

# for each item in 'list_a', if 'item' is not in 
# 'list_b', add item to 'new' 

這是一樣的:的「首先item

i = 0 
for item in list_a: 
    if item not in list_b: 
     new[i++] = item 

想象的那麼你投入的價值列表。從本質上講列表理解枚舉,保持指數的跟蹤和做這樣的事情對於每次迭代:

new[index] = item