Python循环遍历列表但没有找到值

时间:2016-01-11 19:05:16

标签: python python-2.7

先谢谢你看看这个!基本上我有一个循环遍历列表试图找到数字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()

6 个答案:

答案 0 :(得分:9)

这是一段令人困惑的代码。

  1. print输出,但该函数不返回任何内容。 (它也可以打印东西,但它不会返回任何东西。)
  2. 该函数有一个while循环,并且自身也会重复出现。 (在某些情况下这是合适的,但这不是其中之一。)
  3. counter最初为0,但您的第一次检查是counter > 6。 0不大于6。 (这在技术上并不错,但非常令人困惑。)
  4. 1位于索引5.为什么要查找6?
  5. 一旦达到所需的索引,就不会终止循环。

答案 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块永远不会跑。您最不希望将>更改为<。此时,您的代码主要按预期工作,但请考虑:

  1. 一旦找到它正在寻找的值,应用程序将进入无限循环。
  2. for循环比使用计数器的while好得多。
  3. 如果可能的话,你应该真的避免使用全局变量(这里很可能)。