2017-04-09 20 views
1

你知道當你通過反覆試驗找到解決方案,但你偶然發現了這麼多,你現在無法理解答案嗎?這個輸入通過列表理解做什麼?

嗯,這是發生在我與這片:

entr = [list(int(x) for x in input().split()) for i in range(int(input()))] 

輸入是通過複製完成,粘貼此整個塊:

9 
8327 0 
0070 0 
2681 2 
1767 0 
3976 0 
9214 2 
2271 2 
4633 0 
9500 1 

什麼是我的列表中理解究竟在做每一步?並考慮到this:如何使用for循環重寫它?

回答

1

事實上,你的代碼不是嵌套的列表理解,因爲你使用list construtor而不是單純的列表理解。 這條線作爲與您的代碼:

entr = [[int(x) for x in input().split()] for i in range(int(input()))] 

要了解這一行,你必須記住在Python列表理解的基本結構,它由兩個組件objcondition的用方括號

lst = [obj condition] 

它可以被轉換爲一個循環是這樣的:

lst = [] 
condition: 
    lst.append(obj) 

那麼,回到這個問題。 你現在需要做的是將嵌套的列表理解分解成循環,通常你從後面的條件開始,從外層空間到內層空間。你有:

entr = [] 
for i in range(int(input())): 
    entr.append([int(x) for x in input().split()])) # the obj is a list in this case. 

而現在,你可以打破列表理解在第3行

entr = [] 
for i in range(int(input())): 
    entry = [] 
    for x in input().split(): 
     entry.append(int(x)) 
    entr.append(entry) 

所以,現在的東西原線,可以很容易地理解。

  1. 該程序構造一個名爲entr的條目列表;
  2. 該程序要求用戶輸入並將輸入string轉換爲int,這是要輸入的entrys的數量(假設它是num);
  3. 程序要求用戶輸入num次,每次輸入與空格分開的東西。
  4. 該程序將每個字符串拆分成一個列表(在上面的代碼中命名爲entry),用str.split()方法輸入(參數sep默認爲空格)。並在每個循環中列出appendentry
  5. 對於entry列表中的每個元素,它將轉換爲int

我的英語可能會很差,隨意提高我的答案:)

+0

非常感謝你的幫助。我現在很清楚 – MPadilla

+0

很高興你得到它。 – Feishi

1

這相當於這個:

entr = [] 
for i in range(int(input())): 
    row = [] 
    for x in input().split(): 
     row.append(int(x)) 
    entr.append(row) 

您可以複製,粘貼到幾個步驟列表理解。第一內部循環/列表:

entr = [] 
for i in range(int(input())): 
    row = [int(x) for x in input().split()] 
    entr.append(row) 

沒有row變量:

entr = [] 
for i in range(int(input())): 
    entr.append([int(x) for x in input().split()]) 

然後,外環/列表(複製多行爲清楚起見):

entr = [ 
    [int(x) for x in input().split()] 
    for i in range(int(input())) 
] 

你必須相同的嵌套理解,除了內部的一個已被寫爲傳遞給list構造函數的生成器,所以它看起來像list(int(x) for x in input().split())而不是[int(x) for x in input().split()]。這比使用列表理解有點混亂。

我希望這個解釋有幫助!