我正在从头开始阅读Joel Grus的数据科学,并发现了一些有点神秘的东西。基本上,在一些示例代码中,他写了
a = [1, 2 ,3 ,4]
xs = [i for i,_ in enumerate(a)]
他为什么喜欢这样做?而不是
xs = range(len(a))
答案 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。 两者都是可读的。