背景:
我有一个非常大的3D笛卡尔坐标列表,我需要处理这个列表,用Z坐标(即该平面中的所有坐标)对坐标进行分组。目前,我使用每个Z坐标的循环手动创建列表中的组,但如果现在有几十个可能的Z(以前只处理2-3个平面)坐标,这就变得不切实际了。我知道如何根据相似的元素对列表进行分组,但我正在寻找一种方法来自动化这个过程来获得n个可能的Z值。
问题:
为同一个Z坐标分组列表元素的过程自动化,然后为每个平面创建唯一列表的最有效方法是什么?
代码段:
我只是使用一个简单的列表理解来分组各个平面:
newlist=[x for x in coordinates_xyz if insert_possible_Z in x]
我正在寻找它为数据集中的每个Z平面自动创建一个新的唯一列表。
数据格式:
((x1,y1,0), (x2, y2, 0), ... (xn, yn, 0), (xn+1,yn+1, 50),(xn+2,yn+2, 50), ... (x2n+1,y2n+1, 100), (x2n+2,y2n+2, 100)...)
等。
我想自动获取Z = 0,Z = 50,Z = 100等所有坐标。注意Z的值(增量为50)仅为示例,实际数据可以是任意值。 br />
注意:
我的数据是从文件导入的,也可以由列表中的单独模块生成。这是与另一个程序(我还没写过)的接口所必需的。
答案 0 :(得分:1)
通过Z对元素进行分组并将其分组列表的最有效方法是不制作列表。
itertools.groupby执行您想要的分组,而无需创建新列表的开销。
当你不熟悉一般机制时,Python生成器需要习惯一点。 official generator documentation是学习它们有用的原因的良好起点。
答案 1 :(得分:0)
如果我正确地解释了这个,你有一组坐标C =(X,Y,Z),其中有一些离散的Z值。如果是这种情况,为什么不使用字典将坐标列表与关联的Z值关联作为关键字?
您的数据结构如下所示:
z_ordered = {}
z_ordered[3] = [(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)]
与键相关联的每个列表具有相同的Z值。
当然,如果你的Z值是连续的,你可能需要修改它,比如只使关键字与Z值相关联的整数,所以你以1为增量进行分箱。
答案 2 :(得分:0)
所以这是我提出的简单解决方案:
groups=[]
groups[:]=[]
No_Planes=#Number of planes
dz=#Z spacing variable here
for i in range(No_Planes):
newlist=[x for x in coordinates_xyz if i*dz in x]
groups.append(newlist)
这使我可以使用groups[i]
操纵数据集中的任何平面。我也可以操纵我的间距。这也是我现有代码的扩展,正如我在阅读@msw关于itertools的回复后意识到的那样,循环使用我当前的方法正在盯着我看,并且比我想象的要简单得多!