2016-01-28 76 views
2

這個for循環應該迭代我的輸入中的'行',因爲它保存了用戶名,我想把它放在字典中作爲關鍵字,並在該關鍵字中包含一個字典。我的輸出確實包括我需要的信息,但也包括我不想要的奇數行。 我是新來的python,所以我仍然試圖理解語法。 這裏是我的代碼:我的for循環出了什麼問題? Python

def get_name(string_input): 
    split_fullstop = string_input.split('.') 
    list = [] #creates a list        
    for line in split_fullstop: 
     count = 0 
     if count % 2 == 0: #if count is even    
      list.append(line.split('is connected to')) #add info to 'list'  
      count += 1 #increase count 
     names = {name[0]:{} for name in list} 
    return names 

在這裏,打印功能之後的輸出:

{'': {}, 'Levi ': {}, 'Bryant ': {}, 'Jennie likes to play Super Mushroom Man, Dinosaur Diner, Call of Arms': {}, 'Olive likes to play The Legend of Corgi, Starfleet Commander': {}, 'Debra likes to play Seven Schemers, Pirates in Java Island, Dwarves and Swords': {}, 'Levi likes to play The Legend of Corgi, Seven Schemers, City Comptroller: The Fiscal Dilemma': {}, 'Walter ': {}, 'Robin ': {}, 'John ': {}, 'Walter likes to play Seahorse Adventures, Ninja Hamsters, Super Mushroom Man': {}, 'Debra ': {}, 'Freda likes to play Starfleet Commander, Ninja Hamsters, Seahorse Adventures': {}, 'Mercedes likes to play The Legend of Corgi, Pirates in Java Island, Seahorse Adventures': {}, 'Ollie ': {}, 'Robin likes to play Call of Arms, Dwarves and Swords': {}, 'Bryant likes to play City Comptroller: The Fiscal Dilemma, Super Mushroom Man': {}, 'Freda ': {}, 'Olive ': {}, 'Mercedes ': {}, 'John likes to play The Movie: The Game, The Legend of Corgi, Dinosaur Diner': {}, 'Jennie ': {}, 'Ollie likes to play Call of Arms, Dwarves and Swords, The Movie: The Game': {}} 
+0

@AntonProtopopov您應該提到它作爲一個答案,給予好評! –

+0

您沒有寫入輸入內容,也沒有輸出預期的內容。 – tglaria

回答

3

請記住,在for循環下同縮進級別的所有代碼將被運行的每個迭代。因此,您正在for循環所經過的每個項目重新定義變量countnames。正如其中一條評論所述,names應該與return聲明的縮進級別相同。

在每次迭代中重新定義count意味着您始終會發現0 % 2 == 0。它應該在for循環之前定義。此外,當您運行#if count is even部分時,您只會增加count。因此,假設count在循環之前定義,您將看到0爲偶數,增量爲count並且永遠保留奇數值1

同時使用enumerate查看循環索引和值。這樣你只需要檢查索引的偶數/奇數值。

0

也許你的計數是一個錯誤縮進,count是設計來過濾連線。

for line in split_fullstop: 
    count = 0 
    if count % 2 == 0: #if count is even    
     list.append(line.split('is connected to')) #add info to 'list'  
    count += 1 #increase count 
0

因此,您已經使用了「for each loop」,它遍歷了iterable中的每個元素以及內置函數,僅評估偶數索引。取而代之的是,我認爲使用功能範圍更加清晰明瞭。

range(0, len(split_fullstop), 2) 

評估只有甚至

0

注:不要使用built'in變量,如list,因爲你將覆蓋他們,這可能導致在未來出現意外行爲。例如,使用l

由於names = {name[0]:{} for name in list}names = {name[0]:{} for name in list}的位置與if聲明不在同一位置,因此每行都會執行該行。對於count % 2 == 1您將添加到您的dict空列表中的步驟。但是在你的解決方案中,你在每一步都重新定義了count,所以你永遠不會像@Isaac Drachman提到的那樣得到這個結果。所以只要刪除一些空格或選項卡和之前for循環定義count

def get_name(string_input): 
    split_fullstop = string_input.split('.') 
    l = [] #creates a list    
    count = 0      
    for line in split_fullstop: 
     if count % 2 == 0: #if count is even    
      l.append(line.split('is connected to')) #add info to 'list'  
      count += 1 #increase count 
    names = {name[0]:{} for name in l} 
    return names 

或者你也可以用list comprehensionenumerate重寫它:

def get_name(string_input): 
    l = [line.split('is connected to') for i, line in enumerate(string_input.split('.')) if i % 2 == 0] 
    names = {name[0]:{} for name in l} 
    return names 
+0

'names = ...'這一行看起來像是在for循環的'list'結尾運行一次。因此,它看起來應該是一個級別的縮進,而不是縮進另一個級別。 – glibdud

+0

@glibdud當然,謝謝。 –

0

我只專注於自己的count變量,因爲這是第一件事告訴我有一個錯誤:

for line in split_fullstop: 
    count = 0 
    if count % 2 == 0: #if count is even    
     # some code 
    count += 1 #increase count 
    #some code 
return names 

首先,你正在重置count每個循環中的變量count = 0在循環內,因此每個循環count%2將等於0。此行應該在循環之前(之前)。第二,如果條件爲count%2 == 0,如果在一次迭代中,count == 0,則會增加變量,如果條件爲,那麼它將進入if部分,並將值增加到count == 1
在下一個(以及所有其他)迭代中,從count == 1開始,if部分的內部將不會執行,因此count變量不會更改。

所以,它應該是這樣的:

count = 0 
for line in split_fullstop: 
    if count % 2 == 0: #if count is even    
     #some code 
     count += 1 #increase count 
return names