嵌套字典在排序时引发关键错误

时间:2019-06-28 21:04:09

标签: python python-3.x dictionary

我下面的字典叫nested

{1: {1: {'x0': Decimal('21.600')}},
 2: {1: {'x0': Decimal('223.560')}, 2: {'x0': Decimal('21.600')}},
 3: {1: {'x0': Decimal('223.560')},
     2: {'x0': Decimal('279.552')},
     3: {'x0': Decimal('290.868')}},
 4: {1: {'x0': Decimal('21.600')}, 2: {'x0': Decimal('223.560')}},
 5: {1: {'x0': Decimal('21.600')}},
 6: {1: {'x0': Decimal('223.560')}},
 7: {1: {'x0': Decimal('223.560')}, 2: {'x0': Decimal('256.896')}},
 8: {1: {'x0': Decimal('223.560')},
     2: {'x0': Decimal('232.307')},
     3: {'x0': Decimal('244.550')},
     4: {'x0': Decimal('253.296')}},
 9: {1: {'x0': Decimal('223.560')},
     2: {'x0': Decimal('277.219')},
     3: {'x0': Decimal('288.064')}},
 10: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('255.648')},
      3: {'x0': Decimal('281.909')},
      4: {'x0': Decimal('288.314')}},
 11: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('259.712')},
      3: {'x0': Decimal('295.884')}},
 12: {1: {'x0': Decimal('223.560')}, 2: {'x0': Decimal('288.064')}},
 13: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('273.152')},
      3: {'x0': Decimal('299.412')}},
 14: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('259.712')},
      3: {'x0': Decimal('295.884')}},
 15: {1: {'x0': Decimal('223.560')}},
 16: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('246.303')},
      3: {'x0': Decimal('272.564')},
      4: {'x0': Decimal('278.969')}},
 17: {1: {'x0': Decimal('223.560')}},
 18: {1: {'x0': Decimal('223.560')}},
 19: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('249.746')},
      3: {'x0': Decimal('260.590')}},
 20: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('239.300')},
      3: {'x0': Decimal('265.560')},
      4: {'x0': Decimal('271.965')},
      5: {'x0': Decimal('294.708')}},
 21: {1: {'x0': Decimal('223.560')}},
 22: {1: {'x0': Decimal('223.560')}},
 23: {1: {'x0': Decimal('223.560')}},
 24: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('273.152')},
      3: {'x0': Decimal('299.412')}},
 25: {1: {'x0': Decimal('223.560')}, 2: {'x0': Decimal('260.868')}},
 26: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('249.746')},
      3: {'x0': Decimal('260.590')}},
 27: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('246.303')},
      3: {'x0': Decimal('272.564')},
      4: {'x0': Decimal('278.969')},
      5: {'x0': Decimal('298.215')}},
 28: {1: {'x0': Decimal('223.560')}},
 29: {1: {'x0': Decimal('223.560')}},
 30: {1: {'x0': Decimal('223.560')}, 2: {'x0': Decimal('295.596')}}

我试图按每个嵌套字典中的x0值进行排序。

我只想对“内部”值进行排序,因此对于我的具体示例:

{1: {1: {'x0': Decimal('21.600')}},
 2: {1: {'x0': Decimal('21.600')}, 2: {'x0': Decimal('223.560')}},
 [...]

我正在尝试使用sorted()方法对其进行排序:

sorted_dict = sorted(nested.values(), key=lambda x: x['x0'])

但是,这给了我以下错误:

KeyError: 'x0'

如您所见,在2内,对嵌套的字典进行了排序。

编辑

为澄清起见,我的字典实际上包含另一个键:

{1: {1: {'text': 'Hi there!', 'x0': Decimal('21.600')}},
 2: {1: {'text': 'My email is', 'x0': Decimal('223.560')},
     2: {'text': 'example@domain.com', 'x0': Decimal('21.600')}},
 [...]

从@Willem实施解决方案时,仅对x0进行排序,而没有对text键进行排序:

{1: {1: {'text': 'Hi there!', 'x0': Decimal('21.600')}},
 2: {1: {'text': 'My email is', 'x0': Decimal('21.600')},
     2: {'text': 'example@domain.com', 'x0': Decimal('223.560')}},
 [...]

1 个答案:

答案 0 :(得分:1)

x0键在子词典中定义。因此,不能通过在外部值上使用sorted(..)来对其进行排序。

您可以构建如下字典:

from operator import itemgetter

{k : dict(enumerate(sorted(v.values(), key=itemgetter('x0')), 1))
 for k, v in nested.items() }

我们在这里假设子字典的键具有键12,...,但是使用列表而不是键的字典以这种方式增加可能更有意义

对于给定的样本数据,这给我们:

{1: {1: {'x0': Decimal('21.600')}},
 2: {1: {'x0': Decimal('21.600')}, 2: {'x0': Decimal('223.560')}},
 3: {1: {'x0': Decimal('223.560')},
     2: {'x0': Decimal('279.552')},
     3: {'x0': Decimal('290.868')}},
 4: {1: {'x0': Decimal('21.600')}, 2: {'x0': Decimal('223.560')}},
 5: {1: {'x0': Decimal('21.600')}},
 6: {1: {'x0': Decimal('223.560')}},
 7: {1: {'x0': Decimal('223.560')}, 2: {'x0': Decimal('256.896')}},
 8: {1: {'x0': Decimal('223.560')},
     2: {'x0': Decimal('232.307')},
     3: {'x0': Decimal('244.550')},
     4: {'x0': Decimal('253.296')}},
 9: {1: {'x0': Decimal('223.560')},
     2: {'x0': Decimal('277.219')},
     3: {'x0': Decimal('288.064')}},
 10: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('255.648')},
      3: {'x0': Decimal('281.909')},
      4: {'x0': Decimal('288.314')}},
 11: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('259.712')},
      3: {'x0': Decimal('295.884')}},
 12: {1: {'x0': Decimal('223.560')}, 2: {'x0': Decimal('288.064')}},
 13: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('273.152')},
      3: {'x0': Decimal('299.412')}},
 14: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('259.712')},
      3: {'x0': Decimal('295.884')}},
 15: {1: {'x0': Decimal('223.560')}},
 16: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('246.303')},
      3: {'x0': Decimal('272.564')},
      4: {'x0': Decimal('278.969')}},
 17: {1: {'x0': Decimal('223.560')}},
 18: {1: {'x0': Decimal('223.560')}},
 19: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('249.746')},
      3: {'x0': Decimal('260.590')}},
 20: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('239.300')},
      3: {'x0': Decimal('265.560')},
      4: {'x0': Decimal('271.965')},
      5: {'x0': Decimal('294.708')}},
 21: {1: {'x0': Decimal('223.560')}},
 22: {1: {'x0': Decimal('223.560')}},
 23: {1: {'x0': Decimal('223.560')}},
 24: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('273.152')},
      3: {'x0': Decimal('299.412')}},
 25: {1: {'x0': Decimal('223.560')}, 2: {'x0': Decimal('260.868')}},
 26: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('249.746')},
      3: {'x0': Decimal('260.590')}},
 27: {1: {'x0': Decimal('223.560')},
      2: {'x0': Decimal('246.303')},
      3: {'x0': Decimal('272.564')},
      4: {'x0': Decimal('278.969')},
      5: {'x0': Decimal('298.215')}},
 28: {1: {'x0': Decimal('223.560')}},
 29: {1: {'x0': Decimal('223.560')}},
 30: {1: {'x0': Decimal('223.560')}, 2: {'x0': Decimal('295.596')}}}

或带有额外的'text'键:

{1: {1: {'text': 'Hi there!', 'x0': Decimal('21.600')}},
 2: {1: {'text': 'example@domain.com', 'x0': Decimal('21.600')},
     2: {'text': 'My email is', 'x0': Decimal('223.560')}}}