python - Binning into timeslots - 有没有比使用 list comp 更好的方法?

标签 python

我有一个事件数据集(具体是推文),我正在尝试对其进行分类/离散化。到目前为止,以下代码似乎工作正常(假设 100 个垃圾箱):

HOUR = timedelta(hours=1)
start = datetime.datetime(2009,01,01)
z = [dt + x*HOUR for x in xrange(1, 100)]

但是后来,我在 python 文档中遇到了这条重要的线 '这使得使用 zip(*[iter(s)]*n) 将数据系列聚类成 n 长度组的习惯用法成为可能>'。 zip 习语确实有效 - 但我不明白如何(例如 * 运算符是什么?)。我怎样才能使我的代码更漂亮?我猜这意味着我应该制作一个生成器/可迭代的时间产生以小时为单位的时间?

最佳答案

我会尽力解释zip(*[iter(s)]*n)就一个更简单的例子而言:

假设您有列表 s = [1, 2, 3, 4, 5, 6]

iter(s)给你一个 listiterator将从 s 产生下一个数字的对象每次你请求一个元素。

[iter(s)] * n给你列表 iter(s)在其中 n 次,例如[iter(s)] * 2 = [<listiterator object>, <listiterator object>] - 这里的关键是这些是对相同迭代器对象的 2 个引用,而不是 2 个不同的迭代器对象。

zip获取多个序列并返回一个元组列表,其中每个元组包含每个序列中的第 ith<​​/em> 个元素。例如zip([1,2], [3,4], [5,6]) = [(1, 3, 5), (2, 4, 6)]其中 (1, 3, 5)是传递给 zip 的参数中的第一个元素和 (2, 4, 6)是传递给 zip 的参数中的第二个元素.

**[iter(s)]*n 前转换 [iter(s)]*n从列表变成传递给 zip 的多个参数.所以如果n是 2 我们得到 zip(<listiterator object>, <listiterator object>)

zip将从它的每个参数请求下一个元素,但是因为它们都是对同一个迭代器的引用,所以这将导致 (1, 2) ,它再次执行相同操作,结果为 (3, 4)并再次导致 (5, 6)然后没有更多的元素所以它停止了。因此结果 [(1, 2), (3, 4), (5, 6)] .如前所述,这就是将数据系列聚类成 n 个长度的组。

关于python - Binning into timeslots - 有没有比使用 list comp 更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3019084/

相关文章:

python - 在 Windows 上使用 Pip 在全局环境而不是 virtualenv 中安装包

python - 回归结果不正确

python - Linux 中的 Century Gothic 字体

python - 如何计算大文件中每个数字的每次出现次数

Python/Pandas HDF5 NameError 问题

java - XBee 系列 2 尝试接收数据包时挂起并超时

python - 如何在 mako 模板中设置变量?

python - Django queryset update() in += 方式

python:分散不显示

python - 如何设置 Postgres 扩展?