我编写了一个代码,它将两个集合返回的值(tag_coordinates,tag_id)从函数更新为单个集合(required_info)。当我尝试在required_info中打印值时,该值将打印两次,并且集合中的元素不会被排序。
def GetLabels(taginfo): #this function gets the value taginfo, from an another code
tag_coordinates = set() #set to update tag_coordinates
tag_id = set() #set to update tag_id
required_info = set() #set to update required_info
r=60
for (tag,xy,orient,err,wl,sq) in taginfo:
xy2= (int(xy[0]+r*math.sin(math.radians(orient))),int(xy[1]-r*math.cos(math.radians(orient))))
tag_coordinates.add(xy) #corresponding tag_coordinates
tag_id.add(tag) #corresponding tag_id
required_info.update(tag_coordinates,tag_id)
print required_info
现在,一旦我打印required_info,我将得到一个打印两次的集合,其中来自set tag_coordinates的相应值,tag_id没有排列在一起。有什么建议吗?
答案 0 :(得分:0)
我不确定你想要达到的目标,但如果你想要一组对(标签,坐标)
def get_labels(taginfo):
return {
(tag, calc_coordinates(x, y, orient))
for tag, (x, y), orient, *_ in taginfo
}
def calc_coordinates(x, y, orient):
orient_rad = 60 * math.radians(orient)
return int(x + math.sin(orient_rad)), int(y - math.cos(orient_rad))
如果一个tagid可以有多个cooridantes,那么你可以使用groupby
groupby(operator.itemgetter(0), get_labels(taginfo))
将按标记对坐标进行分组。
get_labels
仅为GetLabels
,但符合PEP8标准。函数应该有小写字母并且使用snake_case而不是CamelCase。
calc_coordinates
只是从这一行中提取的函数
xy2= (int(xy[0]+r*math.sin(math.radians(orient))),int(xy[1]-r*math.cos(math.radians(orient))))
同样,它不符合PEP8,可读性也不那么好。
orient_sin
只是提高性能和可读性的临时变量。由于我不知道域名,我可能会给它带来丑陋的名字,但你可以改进它。
get_labels
返回一组对(tag_id,coordinates)。它是通过python的set comprehension特性定义的。