从codingbat网页,从list 1 python,它要求我写一个定义,如果两个元素的数组包含数字2或3,它返回true,我写道:
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 :(得分:3)
问题是您只是检查第一个值,然后返回True
或False
。而是按如下方式进行:
<强> 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
答案 1 :(得分: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))