2013-09-29 40 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))