在python中努力理解这个'高级'for循环

时间:2014-11-19 01:29:55

标签: python for-loop

我知道如何为循环做基本操作,但我很难理解这段代码中的for循环。我正在寻找一种方法来查找列表中的子字符串并获取索引(因此我可以获取该字符串并对其进行切片 - 在此示例中,如果有一个列表项X minute [s],则提取值25)。 / p>

这段代码可以工作并返回3,但是我正在努力去理解我等等 - 我只是一直致力于开始的for循环。注意我还没有定义i或s。我确实理解了枚举。

注意可能还有其他方法可以做到这一点但是当我开始走这条路的时候,我意识到我并没有理解我发现的许多类似于下面的for循环的例子,所以我现在已经注意到了理解这种方法。

非常感谢提前解释

uptime list = ['routerX uptime is 2 weeks', '6 days', '4 hours', '25 minutes']

min_index = [i for i, s in enumerate(uptime_list) if 'minute' in s]

3 个答案:

答案 0 :(得分:1)

函数enumerate()将返回[(0, element1), (1, element2), ...]形式的元组列表,并使用条件列表推导来过滤该列表,最后只选择索引。

答案 1 :(得分:1)

这里的第一个术语i是循环的每次迭代返回的内容(假设条件为真 - 稍后会更多)。

在第二部分中,for i, s in enumerate(uptime_list) enumerate函数将字符串列表放入可以迭代的元组列表中:

>>> for x in enumerate(uptime_list): print(x)
(0, 'routerX uptime is 2 weeks')
(1, '6 days')
(2, '4 hours')
(3, '25 minutes')

然后,循环中的每次迭代都会发生多次赋值。例如,如果您执行x,y = 0,1,则x将为0,y将为1.唯一的区别是,在这种情况下,元组来自enumerate功能并被分配到is

最后,最后一部分if 'minute' in s只会在条件为真时返回第一个i(即"分钟"在{{1}当前正在查看的变量)。如果您向包含字符串"分钟"的s添加第二个术语,则uptime_list将包含多个数字,因为列表中的多个元素的条件为真。

答案 2 :(得分:1)

列表推导可以直接翻译成明确的for语句。

您从第一个for子句中获取所有内容,并将它们作为单独的语句嵌套。在最里面的语句中,您append列表中for子句之前的表达式。这是整个规则。所以,这个:

min_index = [i for i, s in enumerate(uptime_list) if 'minute' in s]

......意思是:

min_index = []
for i, s in enumerate(uptime_list):
    if 'minute' in s:
        min_index.append(i)

有关更长的说明,请参阅官方教程中的List Comprehensions。有关语法和语义的完整细节,请参阅语言参考中的Displays for sets, lists, and dictionaries。*


如果您不理解enumerate,那么这只是获取列表(或其他可迭代)的每个元素的索引和值的方法。 For example, enumerate(['x', 'y', 'z'])为您提供(0, 'x'),然后(1, 'y'),然后(2, 'z')

因此,每次循环时,s都是uptime_list的值之一,而i是该值的索引。因此,最后,我们列出了uptime_list的所有索引,其对应值包含字符串'minute'。例如,鉴于此:

uptime_list = ['20 seconds', '3 minutes 5 seconds', '17 seconds', '1 minute']

您将获得[1, 3],因为元素#1和#3包含minute


*请注意,部分细节会随着时间的推移而发生变化,因此,如果您使用的是旧版本,尤其是2.x版本,请在文档中切换到正确的版本。