如何在Set中追加函数返回的值?

时间:2017-05-28 10:10:31

标签: python function set

我编写了一个代码,它将两个集合返回的值(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没有排列在一起。有什么建议吗?

1 个答案:

答案 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特性定义的。