在python中生成索引列表的方法之间的区别

时间:2016-04-15 12:41:01

标签: python indexing

我正在从头开始阅读Joel Grus的数据科学,并发现了一些有点神秘的东西。基本上,在一些示例代码中,他写了

a = [1, 2 ,3 ,4]
xs = [i for i,_ in enumerate(a)]

他为什么喜欢这样做?而不是

xs = range(len(a))

4 个答案:

答案 0 :(得分:14)

答案:作者的个人偏好。我找到了

[i for i, _ in enumerate(xs)]

更清晰,更易读

list(range(len(xs)))

对我来说很笨拙。 (我不喜欢阅读嵌套功能。)你的里程可能会有所不同(显然也是如此!)。

那就是说,我很确定我没有说做第二次,我只是喜欢第一次。

来源:我是作者。

P.S。如果你是一个无意阅读任何东西的评论者,我会写一篇关于Python的文章,如果你偶然读到这个答案我会道歉。

答案 1 :(得分:8)

我看了the code available on github并且坦率地说,除了作者的个人偏好之外,我没有看到任何其他原因。

但是,结果需要list indexes = [i for i, _ in enumerate(data)] # create a list of indexes random.shuffle(indexes) # shuffle them for i in indexes: # return the data in that order yield data[i] ,例如this

range(len(data))

在Python 3上使用该部分中的裸random.shuffle()是错误的,因为range需要一个可变序列作为参数,而list(range(len(data)))对象需要Python 3是不可变的序列。

我个人会在我链接的情况下在Python 3上使用class Product < ActiveRecord::Base default_scope { includes(:prices) } has_many :prices def best_price(price_groups) prices.where(price_group_id: price_groups).minimum(:value) end def default_price prices.where(price_group_id: 1).first.value end end ,因为它保证更高效如果传入生成器/迭代器将会失败事故,而不是序列。

答案 2 :(得分:2)

不作为作者,我不得不猜测,但我的猜测是它与Python 2和3的兼容性。

在Python 2中:

>>> a = [1,2,3,4]
>>> xs = range(len(a))
>>> xs
[0, 1, 2, 3]
>>> type(xs)
<type 'list'>

在Python 3中:

>>> a = [1,2,3,4]
>>> xs = range(len(a))
>>> xs
range(0, 4)
>>> type(xs)
<class 'range'>

现在,当您直接在range上进行迭代时,这并没有什么不同,但如果您以后计划将索引列表用于其他内容,则作者可能认为枚举比list(range(len(a)))

更容易理解

答案 3 :(得分:-2)

两者都可以。 当我开始在python中编码时,我更多列表(范围(len(a)))。 现在我更加在pythonic way。 两者都是可读的。