【问题标题】:What data structure to use to represent a bar graph用什么数据结构来表示条形图
【发布时间】:2015-10-30 18:57:43
【问题描述】:

问题确实比标题允许我指定的范围更广。 我有一个大文件,按照接收到的顺序表示无序编号的数据包以及与之对应的时间戳,例如(为清楚起见,箭头包含在文件中,而不是真正在文件中):

seq_1 ----> 时间戳

seq_2 ----> 时间戳

seq_3 ----> 时间戳

seq_2 ----> 时间戳

seq_5 ----> 时间戳

seq_4 ----> 时间戳

...

时间戳总是会增加,但我可能会重复数据包、数据包乱序等。我已将文件解析为字符串列表,现在必须确定适当的数据结构来保存它,考虑到我需要:

  1. 删除所有重复的序列号,只保留第一个到达的序列号。
  2. 获取按序号排序的有序可迭代结构。

我的想法是我可以绘制(虽然不是真的要这样做)一个图表条,x 轴是序列号,y 轴是时间戳。我需要手动找到局部最大值和最小值,所以我应该能够访问任何条目的相邻条目。

我曾考虑将行列表解析为 dictionary(sequence_number, timestamp),小心不要覆盖现有条目(条件 1),然后是 turning it into a list of tuples,最后是 sorting the list by keylist 应该允许我访问相邻的条目,从而满足条件 2。解析的文件很大,所以我想知道 是否有可以更好扩展的解决方案(不需要在两个数据之间进行转换结构 + 后验排序)。

【问题讨论】:

标签: python data-structures


【解决方案1】:

最简单的选择是将内容转储到字典中并在最后对键进行排序。 d.get 调用确保它保留第一个遇到的值(如果存在),或者插入一个新值(如果不存在)。

In [23]: s = """seq_1 ----> timestamp1
   ....: seq_2 ----> timestamp2
   ....: seq_3 ----> timestamp3
   ....: seq_2 ----> timestamp4
   ....: seq_5 ----> timestamp5
   ....: seq_4 ----> timestamp6
   ....: seq_9 ----> timestamp7
   ....: seq_10 ----> timestamp8
   ....: seq_6 ----> timestamp9
   ....: seq_7 ----> timestamp10
   ....: seq_2 ----> timestamp11
   ....: seq_4 ----> timestamp12"""

In [24]: d = {}

In [25]: for line in s.split("\n"):
    seq, ts = map(str.strip, line.split("---->"))
    d[seq] = d.get(seq, ts)
   ....:

In [26]: sorted(d.items(), key=lambda x: int(x[0][4:]))
Out[26]:
[('seq_1', 'timestamp1'),
 ('seq_2', 'timestamp2'),
 ('seq_3', 'timestamp3'),
 ('seq_4', 'timestamp6'),
 ('seq_5', 'timestamp5'),
 ('seq_6', 'timestamp9'),
 ('seq_7', 'timestamp10'),
 ('seq_9', 'timestamp7'),
 ('seq_10', 'timestamp8')]

【讨论】:

  • 我最终这样做了,但除非我遗漏了什么,否则这是我最初提出的想法,我正在寻找替代方案(解析成字典,丢弃重复项;将字典转换为未排序的用items()列出;最后用sorted()排序。
  • 是的,通读一遍,这基本上就是您的建议。由于它是解决问题的 4 行方法,不需要任何外部库,因此值得先尝试。如果它运行得足够快,你就完成了,如果没有,你就有了一个可以比较的基准。在这样做之前尝试提出替代方案,这听起来像是过早的优化。
  • 是的,你是对的,我试过这个方法,只用了几秒钟就可以在一个几十万行的文件上运行,所以我过早地优化了 :) 只是以为我可以使用有机会了解更多有关数据结构的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多