Python:从元组列表中构建由最小值组成的元组

Python:从元组列表中构建由最小值组成的元组,python,Python,我绝对相信这个问题以前一定被问过多次,但就我的一生而言,我找不到一条线索来回答这个问题: 我正在制作一个模型导出器,通过遍历顶点列表并将最低和最高的x、y和z值选取到相同形式的它们自己的最小/最大元组中,我希望计算每个对象的最小和最大边界。我现在的做法是: x = max(vertices,key=itemgetter(0))[0] y = max(vertices,key=itemgetter(1))[1] z = max(vertices,key=itemgetter(2))[2] exte

我绝对相信这个问题以前一定被问过多次,但就我的一生而言,我找不到一条线索来回答这个问题:

我正在制作一个模型导出器,通过遍历顶点列表并将最低和最高的x、y和z值选取到相同形式的它们自己的最小/最大元组中,我希望计算每个对象的最小和最大边界。我现在的做法是:

x = max(vertices,key=itemgetter(0))[0]
y = max(vertices,key=itemgetter(1))[1]
z = max(vertices,key=itemgetter(2))[2]
extents_max = (x, y, z)
x = min(vertices,key=itemgetter(0))[0]
y = min(vertices,key=itemgetter(1))[1]
z = min(vertices,key=itemgetter(2))[2]
extents_min = (x, y, z)

这是可行的,但是在python中有没有更优雅的单行程序方法呢?

只需删除重复的0、1、2,这是一个单行程序:

extents_max = [max(vertices,key=itemgetter(i))[i] for i in range(3)]
如果您需要它保持元组,如您在示例中所示:

extents_max = tuple(max(vertices,key=itemgetter(i))[i] for i in range(3))
>>> vertices = [(1,4,2), (1,3,0), (4,2,5)]
>>> mins, maxs = zip(*[(min(map(itemgetter(i), vertices)),
...                     max(map(itemgetter(i), vertices)))
...                    for i in range(3)])
>>> mins
(1, 2, 0)
>>> maxs
(4, 4, 5)

您可以使用序列解包计算这些值:

mins, maxs = zip(*[(min(map(itemgetter(i), vertices)),
                    max(map(itemgetter(i), vertices)))
                   for i in range(3)])
例如:

extents_max = tuple(max(vertices,key=itemgetter(i))[i] for i in range(3))
>>> vertices = [(1,4,2), (1,3,0), (4,2,5)]
>>> mins, maxs = zip(*[(min(map(itemgetter(i), vertices)),
...                     max(map(itemgetter(i), vertices)))
...                    for i in range(3)])
>>> mins
(1, 2, 0)
>>> maxs
(4, 4, 5)
蠕形螨:

verts =  [(-94, -24, -87), (90, 27, -56), (-22, -59, -44), (50, -70, 52),
          (-31, 37, -24), (-73, 53, 66), (-47, -28, 99), (-3, -42, -66), 
          (2, 85, 58), (79, -86, 39)]
查找最小/最大值:

z = [(min(l),max(l)) for l in zip(*verts)]  # [(min,max) for each 
                                                  #  (x0,..,xn),(y0,..,yn),(z0,..,zn) ]

extends_min, extends_max = zip(*z)

print(extends_min, extends_max)
输出:

(-94, -86, -87) (90, 85, 99)

你能给出一个简单的、可重复的例子来说明
顶点可能是什么样子吗?还有,为什么你要将列表的第一个和第二个元素分别用于
y
z
?这似乎是您努力追求的目标,但是,只要给我们
顶点
,更多的代码“顶点”是表单(x,y,z)上的元组列表。我使用max()/min()按项目0(x)、1(y)和2(z)对元组进行排序,然后检索我为每个轴排序的项目,并使用它们构建一个新的元组。不幸的是,这与@WillemVanOnsem的做法大致相同-他用一行代码实现了它:/谢谢!不像威廉的答案那样简洁,但在我看来更具可读性,因此被标记为答案!