访问使用zip内置函数创建的元组的不同方法

时间:2018-01-16 08:59:52

标签: python

我想对一个整数元组进行排序(按降序排列)然后我想在一组中排序之后用索引的顺序保存一个元组。以下代码完成了这项工作:

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创建的元组,而无需将其输入列表然后将其编入索引?

1 个答案:

答案 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)}

这让你成为第一个元组。