2013-09-29 41 views
0

我对python很新,我的歉意是这已经被回答。我可以看到很多以前对“排序”问题的答案,但是我的问题似乎与这些问题和答案有点不同。排序基于可变数量的排序键输入后执行

我有一列键,包含在一个元组中的每个键,我正在尝试排序。每个密钥都是从CSV文件中的列的子集派生的,但是这个子集在运行时由用户确定,并且不能进行硬编码,因为它会因执行而异。我还有一个日期时间值,它总是作为元组中最后一个元素的一部分形成的(所以至少有一个元素可以排序 - 即使用户没有提供额外的元素)。

的元组进行排序的样子:

(col0, col1, .... colN, datetime) 

凡COL0到科隆是基于“N”在一个CSV文件列中的值,并且可以从运行之间改变。

在每个执行过程中,列表中的元组在每个元组中始终具有相同数量的项目。但是,它们需要能够根据用户输入而在运行之间变化。

的排序是这样的:

sorted(concurrencydict.keys(), key=itemgetter(0, 1, 2)) 

...当我做硬编码排序基于前三列。问题是我不知道在执行之前需要对3件物品进行分类 - 可能是1,2,3或更多。

我希望这个描述有意义。

我还没有想到如何让itemgetter接受可变数量的值。

有没有人知道是否有一个优雅的方式来执行基于python项目的可变数量的排序项目的数量确定在运行时(而不是基于固定的列号或属性名称)?

+2

'键= itemgetter(* sort_columns)'? – Blckknght

+0

太容易了 - 我对Python的新鲜感恐怕 –

回答

0

我想我会把我的评论变成一个答案。

通过在函数调用中使用*args,可以传递可变数量的参数(将其打包到可迭代对象中)。在特定情况下,你可以把列数的用户提供的选择进行排序为sort_columns列表或元组,然后调用:

sorted_keys = sorted(concurrencydict.keys(), key=itemgetter(*sort_columns))