2016-04-27 57 views
0
def twoTwo(list_2): 

    two_count = list_2.index(2) 

    if two_count == 0: 
     if list_2[1] == 2: 
      print True 
     else: 
      print False 
    elif two_count > 0: 
     if list_2[two_count - 1] == 2 or list_2[two_count + 1] == 2: 
      print True 
     else: 
      print False 

問題: 寫一個函數twoTwo(),給出整數的列表,返回true,如果每一個出現在列表2旁邊的另一個2.twoTwo謎

twoTwo([4, 2, 2, 3]) → true  
twoTwo([2, 2, 4]) → true   
twoTwo([2, 2, 4, 2]) → false 

它爲第二個,但不是最後一個,並沒有試圖嘗試第一個...

+0

如果出現在列表中的_every_ 2與另一個2相鄰,則問題陳述返回true。'list_2.index(2)'將返回出現在列表中的_first_ 2的索引。你需要重寫你的函數來使用循環 – Hamms

+0

返回並不意味着打印 –

回答

0

你們都過於複雜的事情。這是python;只需將問題的語言轉換爲代碼即可。如果列表中出現的每個2都與另一個2相鄰,則返回True,否則返回False。

等同於:如果列表中出現的任何2不與另一個2相鄰,則返回False否則返回True。

def two_two(lst): 
    for i, val in enumerate(lst): 
     # if any two that appears in the list 
     if val == 2: 
      left = i > 0 and lst[i - 1] == 2 
      right = i < len(lst) - 1 and lst[i + 1] == 2 
      # is not next to another two 
      if not left and not right: 
       return False 
    # otherwise, 
    return True 

print two_two([4, 2, 2, 3]) # True 
print two_two([2, 2, 4]) # True 
print two_two([2, 4, 2, 4]) # False 
print two_two([2, 2, 4, 2]) # False 
print two_two([3, 4, 1]) # True 
1

一個簡潔的解決方案是找到使用itertools.groupby相同數字的運行,然後檢查沒有運行有一個鍵2和長度1(使用01檢查)由於2的運行總和等於其長度的兩倍)。

import itertools 

def two_two(xs): 
    return not any(k == sum(g) == 2 for k, g in itertools.groupby(xs)) 

下面是一些簡單的測試代碼:

cases = [ 
    ([], True), 
    ([2], False), 
    ([2, 2], True), 
    ([2, 3], False), 
    ([3, 2], False), 
    ([4, 2, 2, 3], True), 
    ([2, 2, 4], True), 
    ([2, 2, 4, 2], False), 
    ([2, 2, 2, 3], True), 
] 

for xs, want in cases: 
    got = two_two(xs) 
    if got != want: 
     print 'two_two(%s) = %d, want %d' % (xs, got, want) 
0

您可以只使用一個for循環來檢查2秒。一個簡單的例子會是這樣(不寫全功能,但你應該明白了吧...):

for vm1, v, vp1 in zip(list_2, list_2[1:], list_2[2:]): 
    if v == 2 and (vm1 != 2 and vp1 != 2) return False 

return True 

這比找到一個指標要簡單得多。

記得分別檢查第一個和最後2個