gpt4 book ai didi

python - 大型嵌套列表与字典

转载 作者:行者123 更新时间:2023-12-01 02:55:31 25 4
gpt4 key购买 nike

请我征求一些有关 Python 列表的一般建议。我知道我不应该在这里回答“开放”问题,但我担心会走上完全错误的道路。

我的问题是我的 .csv 文件每个大约有 600,000 行长。 .csv 的每一行都有 6 个字段,其中第一个字段是日期时间戳,格式为 DD/MM/YYYY HH:MM:SS。接下来的两个字段为空,最后三个字段包含浮点值和整数值,例如:

23/05/2017 16:42:17,  ,   , 1.25545, 1.74733, 12 
23/05/2017 16:42:20, , , 1.93741, 1.52387, 14
23/05/2017 16:42:23, , , 1.54875, 1.46258, 11

等等

第 1 列(日期时间戳)中没有两个值会相同。

我需要编写一个程序来对数据执行一些基本操作,例如:

  1. 根据情况将所有数据读入字典、列表、集合 (?) 等。
  2. 在日期时间戳列中搜索特定值。
  3. 通读列表并对第 4 列和第 5 列中的 float 进行基本计算。
  4. 根据搜索/计算编写一个新列表。

我的问题是 - 我应该如何“处理”数据以及我是否可能因数据集的长度而遇到问题?

例如,我应该将所有数据导入到一个列表中,并且列表中的每个元素都是每行数据的子列表吗?例如:

[[2017/05/23 16:42:17,'','', 1.25545, 1.74733, 12],[2017/05/23 16:42:20,'','', 1.93741, 1.52387, 14], ...]

或者最好将每个日期时间戳作为字典中的“键”,并使字典“值”成为包含所有其他值的列表,例如:

{'23/05/2017 16:42:17': [ , , 1.25545, 1.74733, 12], ...}等等

如果我使用列表方法,有没有办法让 Python 仅在第一列中“搜索”特定时间戳,而不是在我们知道只有第一列时搜索 600,000 行乘以 6 列包含时间戳?

如果我的查询有点模糊,我深表歉意,但希望任何人都可以提供任何指导。

最佳答案

600000 行并不算多,您的脚本应该可以在列表或字典中正常运行。

作为测试,我们使用:

data = [["2017-05-02 17:28:24", 0.85260, 1.16218, 7],
["2017-05-04 05:40:07", 0.72118, 0.47710, 15],
["2017-05-07 19:27:53", 1.79476, 0.47496, 14],
["2017-05-09 01:57:10", 0.44123, 0.13711, 16],
["2017-05-11 07:22:57", 0.17481, 0.69468, 0],
["2017-05-12 10:11:01", 0.27553, 0.47834, 4],
["2017-05-15 05:20:36", 0.01719, 0.51249, 7],
["2017-05-17 14:01:13", 0.35977, 0.50052, 7],
["2017-05-17 22:05:33", 1.68628, 1.90881, 13],
["2017-05-18 14:44:14", 0.32217, 0.96715, 14],
["2017-05-18 20:24:23", 0.90819, 0.36773, 5],
["2017-05-21 12:15:20", 0.49456, 1.12508, 5],
["2017-05-22 07:46:18", 0.59015, 1.04352, 6],
["2017-05-26 01:49:38", 0.44455, 0.26669, 13],
["2017-05-26 18:55:24", 1.33678, 1.24181, 7]]

字典

如果您正在寻找精确的时间戳,使用字典的查找速度会比使用列表的速度快得多。不过,您必须确切地知道您要查找的内容:"23/05/2017 16:42:17" 的哈希值与 "23/05/2017 16:42 完全不同:18".

data_as_dict = {l[0]: l[1:] for l in data}
print(data_as_dict)
# {'2017-05-21 12:15:20': [0.49456, 1.12508, 5], '2017-05-18 14:44:14': [0.32217, 0.96715, 14], '2017-05-04 05:40:07': [0.72118, 0.4771, 15], '2017-05-26 01:49:38': [0.44455, 0.26669, 13], '2017-05-17 14:01:13': [0.35977, 0.50052, 7], '2017-05-15 05:20:36': [0.01719, 0.51249, 7], '2017-05-26 18:55:24': [1.33678, 1.24181, 7], '2017-05-07 19:27:53': [1.79476, 0.47496, 14], '2017-05-17 22:05:33': [1.68628, 1.90881, 13], '2017-05-02 17:28:24': [0.8526, 1.16218, 7], '2017-05-22 07:46:18': [0.59015, 1.04352, 6], '2017-05-11 07:22:57': [0.17481, 0.69468, 0], '2017-05-18 20:24:23': [0.90819, 0.36773, 5], '2017-05-12 10:11:01': [0.27553, 0.47834, 4], '2017-05-09 01:57:10': [0.44123, 0.13711, 16]}

print(data_as_dict.get('2017-05-17 14:01:13'))
# [0.35977, 0.50052, 7]

print(data_as_dict.get('2017-05-17 14:01:10'))
# None

请注意,您的 DD/MM/YYYY HH:MM:SS 格式不太方便:按字典顺序对单元格进行排序不会按日期时间对它们进行排序。您需要首先使用 datetime.strptime():

from datetime import datetime
data_as_dict = {datetime.strptime(l[0], '%Y-%m-%d %H:%M:%S'): l[1:] for l in data}
print(data_as_dict.get(datetime(2017,5,17,14,1,13)))
# [0.35977, 0.50052, 7]

print(data_as_dict.get(datetime(2017,5,17,14,1,10)))
# None

二分查找列表

如果您正在寻找时间戳范围,字典不会对您有太大帮助。对时间戳列表进行二分搜索(例如使用 bisect )应该非常快。

import bisect
timestamps = [datetime.strptime(l[0], '%Y-%m-%d %H:%M:%S') for l in data]
i = bisect.bisect(timestamps, datetime(2017,5,17,14,1,10))
print(data[i-1])
# ['2017-05-15 05:20:36', 0.01719, 0.51249, 7]
print(data[i])
# ['2017-05-17 14:01:13', 0.35977, 0.50052, 7]

数据库

在重新发明轮子之前,您可能希望将所有 CSV 转储到一个小型数据库(sqlite、Postgresql...)中并使用相应的查询。

Pandas

如果您不希望增加数据库的复杂性,但准备投入一些时间学习新语法,则应该使用 pandas.DataFrame 。它完全可以满足您的需求,甚至更多。

关于python - 大型嵌套列表与字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44237974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com