2014-03-31 75 views
2

從列表1中的encodebat網頁python,它要求我編寫一個定義,如果兩個元素的數組包含數字2或3,則返回true我寫道:Python,檢查列表中的任何元素是否包含在另一個列表中

def has23(nums): 
    for i in range(nums): 
     if i == 2 or i ==3: 
     return True 
     else: 
     return False 

但它似乎是無法應付has23([4, 3])它返回False。我已經知道了解決方案(感謝python社區的人),但我真的不明白我寫的定義有什麼問題。

可以請別人幫忙嗎?

+0

你不需要的範圍 – adarsh

+6

當給出一個列表時,它不會返回False,因爲'range()'不會將列表作爲參數。 – geoffspear

回答

3

問題是,您只是檢查第一個值,然後返回TrueFalse。代替這樣做如下:

1)

def has23(nums): 
    if (2 in nums) or (3 in nums): 
     return True 
    else: 
     return False 

2)@Ricardo提示:return (2 in nums) or (3 in nums)

3)@thefourtheye提示:return len(set(nums) & {2, 3}) > 0

4)@thefourtheye還建議return set(nums).isdisjoint({2, 3})

5)@RemcoGerlich建議return any(i == 2 or i == 3 for i in nums)

6),或者如果你想使用你的循環的類型:

def has23(nums): 
    for i in nums: 
     if i == 2 or i == 3: 
      return True 
    return False 

[注]

我用lambda測試這個問題,這裏是測試任何數量的檢查的方法: 這將檢查to_check任何元素是否在lst

7)

>>> lst = [1,2,4,7,4,10,53,76,45,354,654,434,32] 
>>> to_check = [3,4,9,96,23] 
>>> print any(map(lambda i: i in lst, to_check)) 
True 

我知道這是不是直接關係到你的問題,但它可能是看一下。非常漂亮。

另一種方式:

8)

>>> print len(set(bar) & set(to_check)) > 0

+7

可以簡化爲:'return(2 in nums)or(3 in nums)' –

+1

更好的'return len(set(nums)&{2,3))> 0' – thefourtheye

+0

謝謝大家的光彩補充。 :) – sshashank124

0

確實是有你的代碼有問題:

for i in range(nums): 

nums是一個列表,所以你不能用它range。您可以使用range(len(num)),然後檢查num[0],num[1]等。即

if (nums[i]==2) or (nums[i]==3): 

但你可以這樣做:

for i in nums: 
    if ((i==2) or (i==3)): 

這的確會瀏覽nums所有的值。

你並不需要瀏覽所有的價值,並與檢查:

if (2 in nums) or (3 in nums): 

最後,你可以跳過測試和簡單地做:

return ((2 in nums) or (3 in nums)) 
+0

首先謝謝你的回答,已嘗試只爲我在號碼: if((i == 2)或(i == 3)):但它不工作 – user3480623

+0

CPython解釋器是否足夠聰明,可以在數組中對'((2個數字)或(3個數字))'進行單次掃描? – japreiss

相關問題