先谢谢你看看这个!基本上我有一个循环遍历列表试图找到数字1的while循环。我有下面的代码,它循环“几乎”所有列表,但它没有找到值1的索引,任何见解?
numbers = [24, 10, 92, 28, 71, 1, 80, 70]
counter = 0
number_to_find = 1
def my_loop():
global counter
while counter > 6: #Also not sure while 7 doesn't work, says out of range?
if numbers[counter] == number_to_find:
print "Number found at position", counter
else:
print "Counter not found in position" , counter
counter = counter + 1
my_loop()
print my_loop()
答案 0 :(得分:9)
这是一段令人困惑的代码。
print
输出,但该函数不返回任何内容。 (它也可以打印东西,但它不会返回任何东西。)while
循环,并且自身也会重复出现。 (在某些情况下这是合适的,但这不是其中之一。)counter
最初为0,但您的第一次检查是counter > 6
。 0不大于6。 (这在技术上并不错,但非常令人困惑。)1
位于索引5.为什么要查找6?答案 1 :(得分:3)
您可以使用以下代码实现您正在寻找的内容:
numbers = [24, 10, 92, 28, 71, 1, 80, 1, 70]
number_to_find = 1
for i,j in enumerate(numbers):
if j == number_to_find:
print i, "=>", j
# Output
>>> 5 => 1
>>> 7 => 1
如果您的numbers
不包含重复的数字,您可以使用以下代码,如kojiro所说:
numbers = [24, 10, 92, 28, 71, 1, 80, 70]
number_to_find = 1
print numbers.index(number_to_find)
# Output
>>> 5
但是如果你的代码包含重复的字符,那么它只会显示第一个字符:
numbers = [24, 10, 92, 28, 71, 1, 80, 1, 70]
number_to_find = 1
print numbers.index(number_to_find)
# Output
>>> 5
答案 2 :(得分:2)
counter
如果while counter > 7
大于6,则必须为7或更高。如果您循环global counter
,则索引超出列表大小的范围(从0到7的索引)。
def find_needle(needle, haystack): for idx, item in enumerate(haystack): if needle == item: return idx return None
不要这样做。你不应该使用全局变量。 There are good reasons
def my_loop(): ... my_loop()
你不需要递归。这只是一个for循环非常简单(事实上,没有它就可以做到)。
我会发布一些方法来解决这个问题:
def find_needle(needle, haystack):
return haystack.index(needle)
None
这两个实现不完全 相同的事情 - 如果在needle
中找不到haystack
,则第一个将返回ValueError
第二个将抛出private function cleanDatabase()
{
foreach ($this->tables as $tableName) {
DB::statement("ALTER TABLE $tableName DISABLE TRIGGER ALL");
DB::statement("TRUNCATE TABLE $tableName CASCADE");
DB::statement("ALTER TABLE $tableName ENABLE TRIGGER ALL");
}
}
。我认为前者更宽容,但这取决于你。
答案 3 :(得分:2)
所以有许多方法可以迭代和递归地执行此操作,但是按原样使用OP代码以及我认为他们正在尝试的代码。
注意:使用全局变量通常被认为是不好的做法,您应该将find
列表和数字for counter in range(len(numbers)):
传递给函数。
注意:你的while循环有效地实现了for循环 - numbers = [24, 10, 92, 28, 71, 1, 80, 70]
number_to_find = 1
def my_loop():
counter = 0
while counter < len(numbers):
if numbers[counter] == number_to_find:
print "Number found at position", counter
else:
print "Counter not found in position" , counter
counter = counter + 1
my_loop()
将提供相同的结果
Counter not found in position 0
Counter not found in position 1
Counter not found in position 2
Counter not found in position 3
Counter not found in position 4
Number found at position 5
Counter not found in position 6
Counter not found in position 7
输出:
for
使用for counter in range(len(numbers)):
if numbers[counter] == number_to_find:
print "Number found at position", counter
else:
print "Counter not found in position" , counter
循环执行相同操作:
enumerate
输出相同。
但是,Python的一个更惯用的方法可能是使用for counter, number in enumerate(numbers):
if number == number_to_find:
print "Number found at position", counter
else:
print "Counter not found in position" , counter
:
x-twilio-signature
答案 4 :(得分:0)
要找到第一次出现,请使用numbers.index(x)
,其中x
是您要搜索的号码或所有indices = [idx for idx, number in enumerate(numbers) if elem_list == x]
答案 5 :(得分:0)
对于初学者,我认为您的else
块意味着与if
对应。现在它与while
相关联。缩进else
以使其与if
对齐,然后在else
之后缩进三行以与print
之后的if
对齐:
if numbers[counter] == number_to_find:
print "Number found at position", counter
else:
print "Counter not found in position" , counter
counter = counter + 1
my_loop()
修复后,您的第二个问题是您的程序会立即退出,因为while
条件评估为0 > 6
,这是错误的,因此if
块永远不会跑。您最不希望将>
更改为<
。此时,您的代码主要按预期工作,但请考虑:
for
循环比使用计数器的while
好得多。