根据列表中的第ith个元素对字典进行排序

时间:2019-09-02 16:16:41

标签: python python-3.x algorithm sorting dictionary

编辑-更新的问题:

为了进一步阐述我的问题,我在 test1Res 中添加了更多详细信息:

我有一本名为test1Res的字典,该字典将某些产品名称用作该字典的“键”,并将该产品的测试结果作为键的值。

执行了6个测试(6个条件),因此字典中的每个“值”都是6个整数的列表。

test1Res = {'Wrap': [3,7,13,142,16,193], 'Baby':[3,29,16,146,16,110], 'Goon':[3,7,22,41,88,65],'Marz':[3,9,14,8,56,0],'Adax':[2,2,28,13,79,39]}

我想对字典进行排序,以便:

  • 字典应按其“值”的降序排列-包含6个整数的列表:

    • 第一步-根据第一条标准“ a”进行排序,即每个列表的第0个元素。

O / P:

test1Res = {'Wrap': [3,7,13,142,16,193], 'Baby':[3,29,16,146,16,110], 'Goon':[3,7,22,41,88,65],'Marz':[3,9,14,8,56,0],'Adax':[2,2,28,13,79,39]}

(与输入相同。)(考虑值的第0个元素执行排序。)

  • 第二步-对于每个第0个元素相似的列表(即类似产品的测试“ a”的结果),请根据第二个测试的结果“ b”以降序排列。

O / P:

test1Res = {'Baby':[3,29,16,146,16,110], 'Marz':[3,9,14,8,56,0], 'Wrap': [3,7,13,142,16,193], 'Goon':[3,7,22,41,88,65], 'Adax':[2,2,28,13,79,39]}

请注意,现在已根据第2点对“包裹”,“婴儿”,“古恩”和“马尔兹”进行了排序。考虑到列表的每个第1个定位元素(第0个元素类似),进行了排序。 现在,由于'Wrap'和'Goon'的第一个元素相似,因此在下一步中应仅根据第二个元素对这两个键值对进行排序。

  • 下一步:类似地检查列表中第i个元素相似的第(i + 1)个元素。

最终输出

test1Res = { 'Baby':[3,29,16,146,16,110], 'Marz':[3,9,14,8,56,0], 'Goon':[3,7,22,41,88,65],  'Wrap': [3,7,13,142,16,193], 'Adax':[2,2,28,13,79,39]}

到目前为止,我已经尝试了许多方法,但是只能通过蛮力将其分类到第2步。 (O(n ^ 3)),由于时间复杂性,这是不可接受的。)

忽略任何语法错误。

原始问题

我将一些产品和实验室测试结果存储在一个列表中,并将其整体作为一个字典,如下所示:

test1Res = {'Goon':[3,7,22,41,88,65],'Marz':[3,9,14,8,56,0],'Adax':[2,2,28,13,79,39]}

列表的每个值代表特定测试的结果,例如测试[a,b,c,d,e,f,g]。因此,对于“ Goon”,测试a的结果为3,依此类推。

我想做的是对 test1Res 进行排序,以使其:

  • 排名下降,其中排名基于标准 a-g。

输出应类似于:

test1Res = {'Marz':[3,9,14,8,56,0],'Goon':[3,7,22,41,88,65],'Adax':[2,2,28,13,79,39]}

在这里,首先应在每个键的列表中查找第0个元素。如果是相似的,则应仅再寻找该列表的第二个元素,然后是第三个,然后是第四个,直到最后一个。

3 个答案:

答案 0 :(得分:3)

保证dict仅在CPython 3.6及更高版本中维护插入顺序,因此最好使用OrderedDict:

from collections import OrderedDict

test1Res = {'Wrap': [3,7,13,142,16,193], 'Baby':[3,29,16,146,16,110], 'Goon':[3,7,22,41,88,65],'Marz':[3,9,14,8,56,0],'Adax':[2,2,28,13,79,39]}
d = OrderedDict((sorted(test1Res.items(), key=lambda it: it[1], reverse=True)))
print(d)

打印:

OrderedDict([('Baby', [3, 29, 16, 146, 16, 110]), ('Marz', [3, 9, 14, 8, 56, 0]), ('Goon', [3, 7, 22, 41, 88, 65]), ('Wrap', [3, 7, 13, 142, 16, 193], ('Adax', [2, 2, 28, 13, 79, 39])])

答案 1 :(得分:2)

您可以对值进行排序并以新顺序创建新字典:

>>> dict(sorted(test1Res.items(), key=operator.itemgetter(1), reverse=True))
{'Goon': [3, 7, 22, 41, 88, 65], 'Adax': [2, 2, 28, 13, 79, 39], 'Marz': [1, 9, 14, 8, 56, 0]}

您提供了两个不同的字典,这是第二个字典的结果:

>>> test1Res = {'Marz':[3,9,14,8,56,0],'Goon':[3,7,22,41,88,65],'Adax':[2,2,28,13,79,39]}
>>> dict(sorted(test1Res.items(), key=operator.itemgetter(1), reverse=True))
{'Marz': [3, 9, 14, 8, 56, 0], 'Goon': [3, 7, 22, 41, 88, 65], 'Adax': [2, 2, 28, 13, 79, 39]}

答案 2 :(得分:1)

如果您不想导入operator模块:

test1Res = {'Goon':[3,7,22,41,88,65],'Marz':[3,9,14,8,56,0],'Adax':[2,2,28,13,79,39]}
result = dict(sorted(test1Res.items(), key=lambda elem: elem[1], reversed=True))
print(result)

结果:

{'Adax': [2, 2, 28, 13, 79, 39], 'Goon': [3, 7, 22, 41, 88, 65], 'Marz': [3, 9, 14, 8, 56, 0]}