我有一个事件数据集(具体是推文),我正在尝试对其进行分类/离散化。到目前为止,以下代码似乎工作正常(假设 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/