2013-03-20 48 views
-1

我今天進行了一項測試,其中一個問題是: 編寫函數doubles(),它將整數列表作爲輸入並輸出列表中整數的兩倍,每行一個。雙打名單

我無法弄清楚究竟是如何做到這一點我的代碼是

def doubles(x): 
    for a in range(len(x)-1): 
     for b in (range(a,len(x))): 
      if x[a]*2==x[b]: 
       print(b) 

例如雙打([3,0,1,2,3,6,2,4,5,6, 5])將打印2,6,4

有人可以幫我弄清楚如何做到這一點?

+0

你的代碼有什麼問題? – 2013-03-20 19:29:12

+0

它沒有打印出正確的值 – JGrazza 2013-03-20 19:29:38

+0

它給出了什麼值? – 2013-03-20 19:29:51

回答

1

您的代碼是將每個值與列表中稍後出現的所有值進行比較。但是這個問題只會讓你考慮相鄰的對。

所以,你只需要走一遍列表。像這樣:

def doubles(x): 
    for i in range(1, len(x)): 
     if x[i] == 2*x[i-1]: 
      print x[i] 

更重要的是,你的代碼打印索引而不是值,這是我在上面修復的錯誤。

+0

哦,我現在看到。我不知道這件事感到很蠢,但感謝你的幫助! – JGrazza 2013-03-20 19:34:51

+0

@JGrazza,因爲大衛是第一個找到你的問題的根源,打印索引,而不是索引值,你應該[接受](http://meta.stackexchange.com/questions/5234/how - 接受 - 答覆 - 工作)他的回答。 – John 2013-03-20 21:02:31

+0

@johnthexiii我會說根源是雙循環和錯誤的比較。另外,首先不應該選擇最佳。最好的答案總是我想接受的那個。它不應該歸結爲誰能夠打出最快的,誰能寫出最好的。 – 2013-03-20 21:07:04

0

你不需要嵌套循環。對於每個元素,只需要對它前面的元素進行測試。

1

您只需要遍歷列表一次,使用後面的一個或之前的一個測試每個元素。

下面的示例使用後面的一個測試每個數字,並在最後一個數字處停止。

def doubles(x): 
    for i,a in enumerate(x[:-1]): 
     if x[i+1] == a*2: 
      print a*2 
1
def doubles(lst): 
    prev = None 
    for actual in lst: 
     if prev is not None and actual == 2*prev: 
      print actual 
     prev = actual 
1

這可以很簡單地完成:

def doubles(seq): 
    after = seq[1:] 
    for previous, current in zip(seq, after): 
     if current == previous * 2: 
      print(current) 

預期其中一期工程:

>>> print(list(doubles([3, 0, 1, 2, 3, 6, 2, 4, 5, 6, 5]))) 
2 
6 
4 

我們採取的一個列表的片段,以獲得值的列表從第二個。然後,我們使用zip()來循環每個值與前一個值,並簡單地執行檢查,並打印值,如果它匹配。

您還可以通過更換print()yield構造此作爲發電機(這通常是一個更好的選擇),或者如果你真的想要的清單:

def doubles(seq): 
    after = seq[1:] 
    return [current for previous, current in zip(seq, after) 
      if current == previous * 2] 
+0

@DavidHeffernan哇,假設我很簡單,很容易解決。 – 2013-03-20 19:43:16

1

最簡單的方法是用一個拉鍊要素移位並檢查元素對你的病情

>>> def doubles(x): 
    return [b for a,b in zip(x,x[1:]) if b == 2*a] 

>>> for e in doubles([3,0,1,2,3,6,2,4,5,6,5]): 
    print e 


2 
6 
4 

類似的解決方案,但只是用迭代器

>>> def doubles(x): 
    it1, it2 = tee(x) 
    next(it2) 
    return [b for a,b in izip(it1,it2) if b == 2*a] 

>>> for e in doubles([3,0,1,2,3,6,2,4,5,6,5]): 
    print e 


2 
6 
4 
+0

這是最簡單的指標是什麼? – 2013-03-20 19:38:41