【问题标题】:Store points by x, y and multiple z按 x、y 和多个 z 存储点
【发布时间】:2026-02-04 17:45:01
【问题描述】:

我会写一个例子让你明白我的意思:

例如,我有这 3 个点:(0, 1, 244) - (0, 1, 255) - (1, 2, 133)

实际上,当 2 个点具有相同 (x, y) 时,我需要平均 Z。我的想法是将它们存储在具有双索引/键的东西(数组,字典?)中,其中值是 Z 的数组。

所以我基本上想要这个:[0, 1, [244, 255]] 和 [1, 2, [133]]

我的问题是我不知道用什么来存储它们最简单的方法......

提前致谢!

【问题讨论】:

  • 双索引键是不可能的。
  • 我想通了:/你有其他想法吗?我基本上需要找到给定一对 (x, y) 的 Z
  • 你可以以 x --> y --> [z1, z2 ] 的方式存储数据。如果你能告诉我你的输入数据格式,我可以帮你写代码。
  • 字典存储列表的字典:{0:{1:[244,255]}, 1:{2:[133,]}}。只要你只使用整数...

标签: python arrays list dictionary store


【解决方案1】:

元组可以是字典键:

myDict = {(1,2): 3}

完全有效。

另一种方法是使用 itertools.groupby,但请确保您的列表已按您要用于组的键排序 (https://docs.python.org/3/library/itertools.html#itertools.groupby):

from itertools import groupby

myList = [(1,2,3), (1,2,4), (1,3,4)]
for grp, values in groupby(myList, lambda x: (x[:2])):
   print(grp, list(values))

【讨论】:

  • 我用该列表尝试了您的代码:myList = [(1, 2, 3), (1, 2, 4), (5, 6, 7), (5, 7, 8) , (5, 6, 9)] 但我得到了: ((1, 2), [(1, 2, 3), (1, 2, 4)]) ((5, 6), [(5, 6 , 7)]) ((5, 7), [(5, 7, 8)]) ((5, 6), [(5, 6, 9)])点彼此跟随:/
  • 通过 myList.sort(key=operator.itemgetter(0,1)) 解决!
  • 是的,对不起,我应该提到列表应该按键排序:“通常,迭代需要已经按相同的键函数排序”(docs.python.org/3/library/itertools.html#itertools.groupby
【解决方案2】:

使用字典:

points = [(0, 1, 244), (0, 1, 255), (1, 2, 133)]
d = {}
for point in points:
    key = point[:2]
    if key in d.keys():
        (d[key]).append(point[2])
    else:
        d[key] = [point[2]]
print(d)

对于平均值:

import numpy as np
for k in d.values():
    print(np.mean(k))

【讨论】:

  • 你可以在不使用 numpy 的情况下只做 sum(lst) / len(lst)
【解决方案3】:

这里有几种方法:

  1. 按照 Geotop 的建议,使用以元组为索引的字典。
    在我看来,这是一个优雅的解决方案。

  2. 根据遍历的目的和难易程度,您可以将其转换为嵌套列表,如下所示:

    a = [ [ (1,2), (3,4), (5,6) ], [[123,234,345],[567,678,543],[433,645,754]]]

现在您可以使用a[1][i] 访问与(x,y) 对应的z 值列表,其中元组(x,y) 存储为a[0][i]

第二种方法对我来说似乎要好得多,因为它避免了使用字典并使索引更容易(因为它是用整数索引的。)。但最终,这一切都取决于你的目的。

如果您经常查找数据或数据量很大,则将其随机存储在列表中并通过搜索获取​​值是一个坏主意。

【讨论】: