2017-10-16 115 views
0

這是我編程實驗室的一個問題:python while循環(輸入驗證)

考慮這個數據序列:「3 11 5 5 5 2 4 6 6 7 3 -8」。任何與前一個值相同的值都被認爲是一個連續重複。在這個例子中,有三個連續的副本:第二個和第三個5和第二個6.請注意,最後3個不是連續的副本,因爲它前面有一個7.編寫一些使用循環來讀取這樣的代碼非負整數序列,由負數終止。代碼執行完畢後,會打印遇到的連續副本數。在這種情況下,3將被打印。 假定變量stdin的可用性引用與標準輸入關聯的Scanner對象。

這裏是我的代碼:

firstNumber=-1 

secondnumber=-1 

count=0 

firstNumber=input(int()) 

while int(firstNumber) > 0: 

secondnumber=input(int()) 

if secondnumber == firstNumber: 
    count+=1 
else: 
    firstNumber=secondnumber 
print(int(count)) 

當我運行在MPL的代碼。例如,如果輸入的是:

stdin.txt:·「1↵ 1↵ 1↵ 1↵ 1↵ 1↵ -1

結果是這樣的:

預期輸出: _stdout.txt:· 「5↵ 實際輸出: _stdout.txt:·」 00000005↵

請你指導什麼是我的代碼的問題呢? 非常感謝。

+0

如果您的問題得到解答,請[接受最有幫助的答案](https://stackoverflow.com/help/someone-answers)。 –

回答

1

你可以試試這個:

import re 
import itertools 
s = "3 11 5 5 5 2 4 6 6 7 3 -8" 
new_data = list(map(int, re.findall("-\d+|\d+", s))) 
new_sum = [(a, list(b)) for a, b in itertools.groupby(new_data)] 
final_sum = sum(len(b)-1 for a, b in new_sum if len(b) > 1) 

輸出:

3 
+0

你沒有得到正確的答案(每個數字的第一個不算作重複)。嘗試'sum(len(list(b)) - 1 for a,b in groupby(s.split()))' –

+0

如果你問我,這裏的Groupby效率會很低。仍然,upvoted。 –

1

我建議通過使用zip + sum在列表上做一個元素明智的差異來做到這一點。

sum(y - x == 0 for y, x in zip(l[1:], l)) 

您可以通過定義一個函數很好地做到這一點:

def count_consec_duplicates(lst): 
    return sum(y - x == 0 for y, x in zip(l[1:], l)) 

,並適當地調用它。

data = [1, 1, 1, 1, 1, 1, -1] 
print(count_consec_duplicates(data)) 
5 
0

我被困在這個問題上幾個星期之前,我想通了。它可以幫助您將要排除故障的代碼放入IDLE或repl.it/languages/python3;那麼當你運行它時,你會經常看到錯誤。 stdin變量在python中看起來完全沒有意義,MPL包含它似乎只是爲了讓你困惑。 你非常接近,我也是一名初學者,但我指出了我看到的錯誤,並用錯誤標註了代碼。希望我不會錯過太多,它可以幫助其他人試圖從這個問題中學習到的實際概念。

##your Code## 
firstNumber =-1 #Didn't need to define var. here since defining them below 
secondnumber =-1 #^^^^^but mpl didn't reject them either, may have no effect 
count=0 
firstNumber = input(int()) #this was the ERROR, using 'int' here added zeros 
while int(firstNumber) > 0: 
secondnumber=input(int()) #ERROR, 'int' adds zeros to input line and output 
if secondnumber == firstNumber: 
    count+=1 
else: 
    firstNumber=secondnumber 
print(int(count)) 

###The code MPL wanted (this worked): 

firstNumber=input() 
count = 0 
while int(firstNumber) > 0: 
secondNumber=input() 
if secondNumber == firstNumber: 
    count+=1 
else: 
    firstNumber = secondNumber 
print(count) # align with while loop so it happens after the loop ends, 
              #don't need the int here either