1

我有一个元组元组的元组,我想首先按第二个元素对其进行排序,然后是最下层的第一个,然后是第三个,并为中间层的每个元组迭代地执行此操作。

例如,我想对以下列表进行排序:

sampleToBeSorted = (
        (('D', 52, 'B'), ('D', 32, 'B')),
        (('D', 31, 'A'), ('D', 52, 'B')),
        (('A', 31, 'B'), ('D', 32, 'B')),
        (('C', 31, 'A'), ('B', 24, 'C'), ('C', 33, 'B')),
        (('D', 31, 'A'), ('D', 32, 'B'), ('C', 29, 'B'), ('D', 216, 'C')),
        (('D', 40, 'B'), ('A', 32, 'C')),
        )

这样它看起来像这样:

sampleToBeSorted = (
        ((‘A’, 31, ‘B’), (‘D’, 32, ‘B’)),
        ((‘C’, 31, ‘A’), (‘B’, 24, ‘C’), (‘C’, 33, ‘B’)),
        ((‘D’, 31, ‘A’), (‘D’, 32, ‘B’), (‘C’, 29, ‘B’), (‘D’, 216, ‘C’)),
        ((‘D’, 31, ‘A’), (‘D’, 52, ‘B’)),
        ((‘D’, 40, ‘B’), (‘A’, 32, ‘C’)),
        ((‘D’, 52, ‘B’), (‘D’, 32, ‘B’)),
        )

我已经到了那里,使用:

sortedSample = sorted(sampleToBeSorted, key= lambda x:(x[0][1],x[0][0],x[0][2]))

但这仅对中间层的第一个元组进行排序。为了让它对中间层中的所有元组迭代地执行此操作,我想我可以将其修改为类似

sortedSample = sorted(sampleToBeSorted, key= lambda x:(x[i][1],x[i][0],x[i][2]) for i in range(len(sampleToBeSorted[x])) 

这是无效的语法,我不太清楚写这个的正确方法是什么。有任何想法吗?如果以前已经回答过这类问题,我提前道歉,但我已经尝试并搜索了我能想到的一切。

4

1 回答 1

0

尝试这个:

sortedSample = sorted(sampleToBeSorted, key= lambda x:[(i[1],i[0],i[2]) for i in x])

关键是根据您的标准重新排序的元组列表

结果:

[(('A', 31, 'B'), ('D', 32, 'B')), 
(('C', 31, 'A'), ('B', 24, 'C'), ('C', 33, 'B')),
(('D', 31, 'A'), ('D', 32, 'B'), ('C', 29, 'B'), ('D', 216, 'C')),    
(('D', 31, 'A'), ('D', 52, 'B')), 
(('D', 40, 'B'), ('A', 32, 'C')),
(('D', 52, 'B'), ('D', 32, 'B'))]
于 2016-10-28T20:27:44.037 回答