【问题标题】:Merging custom objects with structure similar to lists, using Python使用 Python 合并具有类似于列表的结构的自定义对象
【发布时间】:2013-01-30 14:45:00
【问题描述】:

我正在尝试为我的研究论文实现某种算法(编程不是我的主要研究领域),我需要一些帮助。考虑以下类型的数据结构(例如 a 和 b),其中我们有一条线性时间线,并且对象放置在该时间轴上,彼此相距一定距离(实际上这些对象表示数据包,其宽度等于传输数据包所需的时间)。我想将它们对齐在右侧,使其成为我们的参考点(时间 t=0),然后合并这两个列表(a 和 b),如果我可以称它们为列表,并得到一个结果列表,如 c 所示。重叠的对象被移动以形成单个列表,并且这些对象之间的间隙相应地发生变化。知道我应该如何进行吗?链表? (如果它们存在于 python 中)。可以将两个以上的列表合并到一个列表中。提前致谢

       ____          _____            ____
    __| a3 |________| a2  |__________| a1 |  (a)

       ____             _____         ____
    __| b3 |___________| b2  |_______| b1 |  (b)


            ____  ____     ______  _____   ____  ____
    _______| a3 || b3 |___| a2   || b2  |_| a1 || b1 |  (c)

【问题讨论】:

  • 它们是从右到左对齐的吗?
  • 是的,它们是从右到左对齐的。
  • 如何处理碰撞?例如,如果来自 b 的数据包不能容纳在来自 a 的 2 个连续数据包之间?
  • 另外,如果a和b上同时有数据,那么数据包应该按什么顺序拼接呢?
  • 取决于与我们参考的距离(即最右侧),先到先得政策。我的意思是最靠近最右侧的数据包在合并后也应该更靠近最右侧。所以我们首先把来自a的两个数据包,然后来自b的一个数据包。或者我们通过将 a 的数据包移向右侧,将第一个数据包从 a 然后从 b 再从 a 放入,这一切都取决于与其余发生冲突的数据包相比,哪个更靠近右侧。如果两者距离完全相同,则可以先放置任何人。

标签: python merge linked-list


【解决方案1】:

例如,数据项的字典和数据序列的列表:

数据 1:

[{'start':0, 't': 10, 'dtype': 'a'}, {'start': 30, 't':20, 'dtype': 'a'} , {'start': 50, 't':30, 'dtype': 'a'}]

数据 2:

[{'start':15, 't': 10, 'dtype': 'b'}, {'start': 40, 't':20, 'dtype': 'b'} , {'start': 50, 't':30, 'dtype': 'b'}]

并合并列表(按开始时间排序):

sorted(data1+data2, key=lambda x:x['start'])

结果:

[{'start': 0, 't': 10, 'dtype': 'a'}, {'start': 15, 't': 10, 'dtype': 'b'} , {'start': 30, 't': 20, 'dtype': 'a'}, {'start': 40, 't': 20, 'dtype': 'b'}, {'start': 50, 't': 30, 'dtype': 'a'}, {'start': 50, 't': 30, 'dtype': 'b'}]

对于延期交货,在排序函数中使用参数“reverse=True”。要查找重叠的元素,您只需在列表迭代期间检查 item['start'] + item['t'] > nextitem['start'] ===> 项目重叠,您必须调整 nextitem根据您的算法开始位置。

【讨论】:

  • 感谢您的建议。我会检查并回来分享结果。
  • @ndpu:我已经尝试过你的建议,它有效。我是这样做的:for item, nextitem in iterate_in_pair(result): while item['start'] + item['t'] > nextitem['start']: nextitem['start'] = item['start' ] + item['t'] 也就是说,我必须使用一个while循环来改变重叠后每个元素的“开始”,这使得它变慢,(我有超过10000个这样的列表,每个列表中有大量的项目)。有什么有效的方法来做到这一点?附言不相关,但我不知道为什么您的答案被评为“-1”。
猜你喜欢
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多