范围和len语句[Python]

时间:2017-09-07 16:09:19

标签: python

我正在观看如何使用python绘制Histrogram并使用此声明并且我不确定它的含义或工作原理。

population_ages = [22,55,62,45,21,22,34,42,42,4,99,102,110,120,121,122,130,111,115,112,80,75,65,54,44,43,42,48]

ids = [x for x in range(len(population_ages))]

我不确定这句话是如何运作的。我曾尝试观看有关len和范围如何工作的视频,但仍不确定它如何适用于此声明。

ids = [..... range(len(population_ages)] 

谢谢,

5 个答案:

答案 0 :(得分:1)

range(start_number, end_number)会创建一个从start_number到end_number的值范围,因此在您的情况下,由于population_ages的长度为28,因此您的值为0,1,2...27

[x for x in ...]只是为您提供列表中的每个值。例如,[x为'Hello'中的x]将使列表等于['H', 'e', 'l', 'l', 'o']x可以命名为任何名称。

答案 1 :(得分:1)

它被称为列表理解,

ids = [x for x in range(len(population_ages))]

相同
ids = []
for x in range(len(population_ages)):
    ids.append(x)

能够仅使用一行代码拼写它通常有助于提高可读性。

在这种情况下,您经常会看到人们使用i作为变量的名称,如:

for i in range(len(mylist)):

因为i是一个整数,将合法索引变为mylist,即半开区间[0..len(mylist)>这意味着第一次i将获得值0,并且最后一次获得列表的长度 - 1。

答案 2 :(得分:1)

让我们看看:

population_ages是包含所有记录的列表。

len(population_ages)返回列表的长度。列表population_ages有28个元素,因此len(population_ages)返回28。

range(len(population_ages)),在本例中为range(28),返回[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]。这是一个列表,其中包含可用于访问population_ages的所有可能索引(您可以评估population_ages[0]population_ages[1],...,population_ages[27];但是从28开始,它将会加注和IndexError)。

[x for x in range(len(population_ages))]生成一个列表,其中每个元素都是range(len(population_ages))中的每个元素。此步骤不会更改任何内容,结果仍为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]

这就是ids被保存的东西。我不知道你的代码后来如何使用它,但这是该行正在做的一步一步。

答案 3 :(得分:1)

在你的例子中: len(population_ages):计算列表population_ages的长度。

for x in range(len(population_ages):当您执行for x in range(number)之类的循环时,您表示循环的范围从1到number。在这种情况下,它将从1到列表的长度为28。

在表达式[x for x in range(number))]中,第一个x取的是循环评估得到的值,在你的情况下它将是1,2,3 ..... 25。

如果您想要显示列表的相同值,您应该输入以下内容:

ids = [x for x in population_ages)]

有关这些主题的更多信息,请阅读:

len_documentationpython-list-comprehensions

我希望这可以帮到你

答案 4 :(得分:1)

其他答案已涵盖基础知识。

我想在

中添加列表理解
ids = [x for x in range(len(population_ages))]

的专业化
[x for x in iterable]

这不是很有用,因为

  • 它生成x,从可迭代
  • 转换而来
  • 无论如何都会产生一些东西。

列表理解在以下情况下更有用:

[f(x) for x in iterable if condition(x)]

如果真的想要一个列表,那就更好了&通过将iterable传递给list对象来更快地创建它:

list(range(len(population_ages)))

(在python 2中,range(len(population_ages))甚至足够,因为它直接返回list,但是如果你真的需要一个可订阅的对象,你的代码就无法移植到python 3。)

另请注意,操纵索引通常是错误的来源。 Python有很多方法来使用索引(与C语言不同)。几个例子:

  • 它可以迭代值本身
  • 它可以使用enumerate(iterable)
  • 迭代索引+值
  • 可以使用zipitertools.zip_longest
  • 并行处理可比尺寸的迭代
  • 有内置词典

所以在使用指数之前要认真思考。可能有更好的方法。