我想对一个整数元组进行排序(按降序排列)然后我想在一组中排序之后用索引的顺序保存一个元组。以下代码完成了这项工作:
my_set = set()
l = (1, 3, 6, 10, 15, 21)
my_set.add(list(zip(*sorted(enumerate(l), key=lambda x: x[1], reverse=True)))[0])
如果我评估my_set
我现在有{(5, 4, 3, 2, 1, 0)}
我试图用以下代码做同样的事情(i代表索引,v代表值):
my_set.add(i for i, v in zip(*sorted(enumerate(l), key=lambda x: x[1], reverse=True)))
它不能以同样的方式工作。该集合变为{ <generator object <genexpr> at 0x7f82e49ce360>}
为什么如果我将zip结果提供到列表中我可以访问里面的元组但是我不能使用其他语法? 是否有另一种方法可以获得由zip创建的元组,而无需将其输入列表然后将其编入索引?
答案 0 :(得分:3)
查看zip
返回的输出。
>>> list(zip(*sorted(enumerate(l), key=lambda x: x[1], reverse=True)))
[(5, 4, 3, 2, 1, 0), (21, 15, 10, 6, 3, 1)]
总是将成为2个元组的列表 - 一个元组是argsorted索引,另一个是实际的排序项。
首先,你没有意识到这一点,因为你在一个集合中散列一个发电机......但是当你决定耗尽发电机时,要做好准备
ValueError: too many values to unpack (expected 2)
总之,您错误地迭代zip
。如果它只是你感兴趣的第一个元组,那么你甚至不需要需要来遍历zip。
代替做什么,是使用next
;
>>> my_set.add(next(zip(*sorted(enumerate(l), key=lambda x: x[1], reverse=True))))
>>> my_set
{(5, 4, 3, 2, 1, 0)}
这让你成为第一个元组。