gpt4 book ai didi

python 2.7 - 使用新的 'order' 约束对列表的输出重新排序

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:25 24 4
gpt4 key购买 nike

我了解一些 c++ 基础知识,但我是 python 的初学者。

我有一段工作代码(见下文),我想添加一个约束来格式化其输出,但我不知道该怎么做...

让我先解释一下该程序的作用:

我有一个输入文件colors.csv包含颜色列表,一种颜色一行:颜色由其名称和色度坐标 X、Y 和 Z 定义,看起来像这样:

Colorname, X1, Y1, Z1
Colorname2, X2, Y2, Z2
...etc.

给定另一个输入文件中包含的任意 XYZ 坐标列表 targets.csv该程序将在输出文件 output.txt 中为我提供解决方案列表

该解决方案首先通过 tetgen 对点云进行三角测量,然后计算四面体中点的重心坐标,(但在这里解释所有内容并不重要......)

解决方案的形式为:

target, name0, density0, name1, density1, name2, density2, name3, density3

始终只有 4 个名称和相关密度。

它看起来像这样:

122 ,PINKwA,0.202566115168,GB,0.718785775317,PINK,0.0647284446787,TUwA,0.0139196648363

123 ,PINKwA,0.200786239192,GB,0.723766147717,PINK,0.0673550497794,TUwA,0.00809256331169

124 ,PINKwA,0.19900636349,GB,0.72874651935,PINK,0.0699816544755,TUwA,0.00226546268446

125 ,OR0A,0.00155317194109,PINK,0.0716160265958,PINKwA,0.195962072115,GB,0.730868729348

126 ,OR0A,0.00409427478508,PINK,0.0726192660009,PINKwA,0.192113520109,GB,0.731172939105

127 ,OR0A,0.00663537762906,PINK,0.073622505406,PINKwA,0.188264968103,GB,0.731477148862

我现在想做什么?

出于实际原因,我希望我的输出遵循一定的顺序。我想要一个“优先级列表”来规则 name, density 的顺序输出。

我的实际程序以我不理解的顺序输出颜色名称,但无论如何我需要这些颜色名称按特定顺序,例如 PINK应该永远是第一个PINKwA第二个,依此类推

而不是:

127 ,OR0A,0.00663537762906,PINK,0.073622505406,PINKwA,0.188264968103,GB,0.731477148862

我想要;

127 ,PINK,0.073622505406,PINKwA,0.188264968103,OR0A,0.00663537762906,GB,0.731477148862

因为我的优先级列表显示:

0, PINK
1, PINKwA
2, OR0A
3, GB

如何简单地将这个函数添加到下面的代码中?有什么想法吗?

编辑代码(有效...):

import tetgen, geometry
from pprint import pprint
import random, csv
import numpy as np
from pprint import pprint

all_colors = [(name, float(X), float(Y), float(Z))
for name, X, Y, Z in csv.reader(open('colors.csv'))]

priority_list = {name: int(i)
for i, name in csv.reader(open('priority.csv'))}

# background is marked SUPPORT
support_i = [i for i, color in enumerate(all_colors) if color[0] == 'SUPPORT']
if len(support_i)>0:
support = np.array(all_colors[support_i[0]][1:])
del all_colors[support_i[0]]
else:
support = None

tg, hull_i = geometry.tetgen_of_hull([(X,Y,Z) for name, X, Y, Z in all_colors])
colors = [all_colors[i] for i in hull_i]

print ("thrown out: "
+ ", ".join(set(zip(*all_colors)[0]).difference(zip(*colors)[0])))

targets = [(name, float(X), float(Y), float(Z), float(BG))
for name, X, Y, Z, BG in csv.reader(open('targets.csv'))]

for target in targets:
name, X, Y, Z, BG = target
target_point = support + (np.array([X,Y,Z]) - support)/(1-BG)
tet_i, bcoords = geometry.containing_tet(tg, target_point)

output = open('output.txt','a')

if tet_i == None:
output.write(str(target[0]))
output.write('\n')


else:
names = [colors[i][0] for i in tg.tets[tet_i]]
sorted_indices = sorted(enumerate(names), key=lambda (i, name): priority_list[name])
output.write(target[0])
counting = 0

for i, name in sorted(enumerate(names), key=lambda (i, name): priority_list[name]):
output.write(',%s,%s' % (name, bcoords[i]))
counting = counting + 1

if counting > 3:
output.write('\n')
counting = 0

output.close()

最佳答案

首先,您需要直接在 Python 代码中编码优先级列表:

priority_list = {
'PINK': 0,
'PINKwA': 1,
'OR0A': 2,
'GB': 3,
}

这将让您快速检索给定颜色名称的顺序。然后,您可以使用 sortedkey 参数按优先级对名称进行排序。但重要的是,您需要检索的不是排序后的名称,而是排序后名称的索引,就像 http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html 一样。 .

sorted_indices = sorted(enumerate(names), key=lambda (i, name): priority_list[name])

enumerate 内置函数用原始名称列表中的索引来注释每个名称,然后 sorted 内置函数对结果 (i, name) 根据其在优先级列表中的排名进行配对。然后我们可以将名称写入文件,后跟 bcoords 数组中的相应元素(使用索引值)。

for i, name in sorted_indices:
output.write(',%s,%s' % (name, bcoords[i]))

所以,这就是我要使代码中的最后一个 block 看起来像这样的:

names = [colors[i][0] for i in tg.tets[tet_i]]
output.write(target[0])
for i, name in sorted(enumerate(names), key=lambda (i, name): priority_list[name]):
output.write(',%s,%s' % (name, bcoords[i]))
output.write('\r\n')
output.close()

在这里,我将你的文件输出策略更改为更加Pythonic - 一般来说,将字符串添加在一起基本上没有完成,最好创建一个格式字符串并填充变量(你也可以使用 . format() 在字符串上执行此操作)。此外,您可以多次调用 .write(),它们只会继续将字节写入文件,因此无需一次创建一个大的长字符串来写出。最后,无需对 '\r\n' 调用 str,因为它已经是一个字符串。

关于python 2.7 - 使用新的 'order' 约束对列表的输出重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18036105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com