2016-01-07 53 views
0

我是新來的python和有一個數組,其中每個元素是一個元組數組。我需要通過元組中的第一個元素對內部數組中的元組進行排序。我的陣列看起來是這樣的:Python排序2D python中的元組數組

[[(u'10:30', u'11:20'), (u'08:30', u'09:20')], [(u'14:30', u'15:50'), (u'10:00', u'11:20'), (u'10:30', u'11:20'), (u'13:00', u'14:20')], [(u'10:30', u'11:20'), (u'08:30', u'09:20')], [(u'14:30', u'15:50'), (u'10:00', u'11:20'), (u'13:00', u'14:20')], [(u'10:30', u'11:20'), (u'08:30', u'09:20')]] 

我試圖做類似

for index, elm in array: 
    array[index] = sorted(elm, key=lambda x: x[0]) 

,但我得到了ValueError異常:需大於0的值來解壓。不知道如果我的語法是關閉或東西

預期的結果是

[[ (u'08:30', u'09:20'), (u'10:30', u'11:20')], [ (u'10:00', u'11:20'), (u'10:30', u'11:20'), (u'13:00', u'14:20'), (u'14:30', u'15:50')], [(u'08:30', u'09:20'),(u'10:30', u'11:20') ], [ (u'10:00', u'11:20'), (u'13:00', u'14:20'), (u'14:30', u'15:50'),] [ (u'08:30', u'09:20'), (u'10:30', u'11:20')]] 

回答

1

當你做for index, elm in array:,你遍歷對對象。在第一次循環迭代中,index(u'10:30', u'11:20')elm(u'08:30', u'09:20'),這不是你想要的(當我輸入你的發佈代碼時,我得到TypeError,而不是ValueError)。你可以讓你的計劃與enumerate()功能是什麼:

for index, elm in enumerate(array): 
    array[index] = sorted(elm, key=lambda x: x[0]) 
+0

@ The6thSense - 有一個前導零,所以沒有必要。如果沒有前導零,一個簡單的'int()'調用將不足以解析這些時間字符串。用字符串格式添加前導零比較容易。 – TigerhawkT3

+0

FWIW,當結果要替換原始列表時使用'sorted'函數不是很有效。這是因爲'sorted'將源列表複製到一個新列表中,並對該新列表進行就地排序。所以在這種情況下,直接使用'.sort()'方法直接進行就地排序會更好。 –

4

for語句丟失enumerate

for index, elm in enumerate(array): 

但是,如果要排序就地列表中,您不需要使用指數。使用list.sort代替:

for elm in array:                
    elm.sort(key=lambda x: x[0]) 
+0

@ The6thSense,像'10:30'這樣的字符串不能轉換爲int。 – falsetru

+0

對不起沒有看到實際數據,現在我有一點疑問,不應該按照正常字符串的時間排序嗎?它提供了正確的輸出,但在這裏足夠的字符串比較? – The6thSense

+1

@ The6thSense,字符串按字典順序排序。 ''10:30'<'11:45'' – falsetru