[英]Fastest way to sorting a corpus dictionary into an OrderedDict - python
[英]Fastest way of creating and sorting the timestamp data with Python?
假设我将有两个 arrays。 第一行将指定时间戳,第二行将是数据。
timeStamp = ['0001','0002','0003',...,'9999']
data = [6234,2372,1251,...,5172]
存储它们的最佳方式是什么? 假设我想将数据从最小到更大的数字进行排序,同时保持它们的时间戳值附加到它们上面?
取决于你想如何使用它。 如果你想 go 没有附加库,我会使用类似的东西
result = sorted(({"timestamp": ts, "data": data} for ts, data in zip(timeStamp, data)), key=lambda d:d["data"]
这基本上是按数据排序的字典列表。 我将 go 用于字典列表,因为与元组列表相比,它更具表现力。
您可以使用二维数组。 您可以使用
timestamp_data = [ [timeStamp[i], data[i]] for i in range(len(timeStamp)) ]
现在,您可以使用
sorted_timestamp_data = sorted(timestamp_data, key=lambda row: row[1])
字典对你来说非常有用。 您可以zip
data
和timeStamp
并按data
排序,然后将元组转换为dict
(字典保留插入顺序)。 然后您将拥有数据-时间戳对,其中数据是键,时间戳是值。
out = dict(sorted(zip(data, timeStamp)))
Output:
{1251: '0003', 2372: '0002', 5172: '9999', 6234: '0001'}
如果您想要 2 个单独的列表,则可以执行以下操作。 不要强制转换为 dict 构造函数,而是解压到列表:
data[:], timeStamp[:] = zip(*sorted(zip(data,timeStamp)))
Output:
[1251, 2372, 5172, 6234], ['0003', '0002', '9999', '0001']
要按照您描述的方式组织数据,您可以简单地执行以下操作:
sorted(zip(timeStamp, data), key=lambda x: x[1])
或者
from operator import itemgetter
sorted(zip(timeStamp, data), key=itemgetter(1))
要存储这个 object,你可以pickle
它, 这里有一个很好的描述。 显然,有很多选项可以存储它。
有多种方法可以做到这一点。 让我们获取以下数据 -
timeStamp = [9,1,2,3,9999]
data = [1245, 6234,2372,1251,5172]
处理数据的默认方式,特别是列表。 zip
方法允许您按字面意思 zip 两个或多个列表元素,创建一个元组列表。 然后,您可以使用sorted
与 lamda function 按元素的特定 position 对组合列表进行排序。
l = zip(timeStamp, data) #storing 2 arrays by attaching them elementwise
print(sorted(l, key=lambda x: x[0]))
[(1, 6234), (2, 2372), (3, 1251), (9, 1245), (9999, 5172)]
Numpy 允许您使用多维 arrays。 对于 2 个列表,您可以简单地将它们np.stack
一起创建一个 2D 数组。
为了排序,您可以在第一列(时间戳)上使用argsort()
,它返回已排序的有序列的索引。 然后,您可以使用这些索引来索引原始二维数组,以按时间戳获取数组的排序顺序。
arr = np.stack([timeStamp, data])
arr[:,arr[0].argsort()]
array([[ 1, 2, 3, 9, 9999],
[6234, 2372, 1251, 1245, 5172]])
最后,同时处理多个列表的最佳方法是将它们视为 DataFrame 中的列。 Pandas 提供了一个方便的框架来处理列/行排列的数据,在这种情况下非常有用,因为您还可以使用列名来标识每个数组/列。
sort_values
允许您根据列名快速对完整数据进行排序。
import pandas as pd
df = pd.DataFrame(zip(timeStamp, data), columns=['timeStamp','data'])
print(df.sort_values('timeStamp'))
timeStamp data
1 1 6234
2 2 2372
3 3 1251
0 9 1245
4 9999 5172
嗯,这很简单
records = list(zip(data, timeStamp))
排序:
records.sort()
在 Python 中,元组从左到右按元素进行比较,因此在这种情况下不需要提供键 function。 而已。 正如在一些评论中那样,没有必要让它过于复杂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.