【问题标题】:Dictionary With Multiple Values To Nested List具有多个值的字典到嵌套列表
【发布时间】:2012-01-01 21:00:41
【问题描述】:

我有一本结构如下的字典:

{'ONE' : (4, 6, 9), 'TWO' : (3, 8, 10)}

我想按每个元组的第三个值对这个字典进行排序。我真的想不出一种方法来将数据设置为字典来完成此操作,但如果我可以将数据转换为嵌套列表,如下所示:

[['ONE', 4, 6, 9], ['TWO', 3, 8, 10]]

我正在寻找最有效的代码来实现这一点。如果有一种方法可以在不转换字典的情况下对其进行排序,那将是理想的。如果没有,将不胜感激从字典到嵌套列表转换的任何帮助。谢谢。

【问题讨论】:

  • 字典没有顺序的概念,所以你不能对它们进行排序。你需要以一种间接的方式来做,就像你建议的那样。
  • 实际上,python 2.7 有 OrderedDict class
  • 但他们只记得输入键的顺序。您仍然需要一些技巧来对数据进行排序(并在此过程中创建一个新的OrderedDict

标签: python python-3.x list dictionary nested-lists


【解决方案1】:

使用内置sorted函数的key参数:

>>> d = {'ONE' : (4, 6, 9), 'TWO' : (3, 8, 10), 'FOUR': (2, 5, 8)}
>>> sorted(d.iteritems(), key=lambda i: i[1][2])
[('FOUR', (2, 5, 8)), ('ONE', (4, 6, 9)), ('TWO', (3, 8, 10))]

编辑

如果某些值是整数而不是元组,那么这样的事情应该可以工作:

>>> d = {'ONE' : (4, 6, 9), 'TWO' : (3, 8, 10), 'FOUR': (2, 5, 8), 'THREE': 0}
>>> sorted(d.iteritems(),
...        key=lambda i: i[1][2] if isinstance(i[1], tuple) else i[1])
[('THREE', 0), ('FOUR', (2, 5, 8)), ('ONE', (4, 6, 9)), ('TWO', (3, 8, 10))]

但是,从长远来看,规范化数据可能会更好,以便所有值都具有相同的格式。

【讨论】:

  • 你们都很棒。这很棒,虽然所有建议都非常有用,但我认为这是最简单的方法(在我删除整数之后)
  • @PatrickD。我已经用处理整数的版本更新了我的答案。
【解决方案2】:

这是一种方法:

result = []
for key, value in dictionary.items():
    result.append([key] + list(value))

如果您的某些值的类型是 int 而不是元组,请尝试以下操作:

result = []
for key, value in dictionary.items():
    try:
        lst = list(value)
    except TypeError:
        lst = [value]
    result.append([key] + lst)

【讨论】:

  • 这给了他一个包含非常规元素的列表。有了这个,他打算按每个元组的第三个值进行排序......在将字典转换为列表时这不会失败,但稍后在排序时会失败。
【解决方案3】:
nestedlist = [[key] + list(value) for key,value in dictionary.items() if value != 0]

【讨论】:

  • 我收到一个“int”不可迭代错误。我的实际字典非常庞大,以字符串为键,每个值在一个元组中三个浮点数。实际示例:“巴西共和国”:(0.013454, 0.005123, 0.008417369999)
  • @PatrickD,您的字典中的一个值是否可能不是元组而是整数?这可以解释你得到的错误。
  • 听起来像@RobWouters 所说的,是的。
  • 啊,是的,翻查字典,有些值是 0 而不是元组。有什么解决方法建议吗?
  • 取决于您希望将这些条目翻译成什么:)
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
相关资源
最近更新 更多