【问题标题】:How to turn 3 lists into an ordered dictionary [closed]如何将 3 个列表变成有序字典 [关闭]
【发布时间】:2016-02-22 18:19:58
【问题描述】:

我已经搜索过,但找不到任何有用的东西...我希望有人可以帮助我。

我有 3 个列表:

a = [(1), (7), (3), (1)]

b = [(2), (4), (7), (4)]

c = [(8), (1), (3), (3)]

当时我在想我可以把它们变成元组:

ab = [(1,2), (7,4), (3,7), (1,4)]

bc = [(1,2,8), (7,4,1), (3,7,3), (1,4,3)]

然后我终于可以把它变成一个有序的 dict 的唯一元组,其中每个元组的第一个元素是键,在重复键的情况下,元组中的下一个最大元素打破平局:

(我不确定,但这段代码可能有效):

print(dict(sorted(ab, key=lambda x: (x[0], x[1]))))

留下({1:4, 3:7, 7:4})

并且还以某种方式在bc中打印匹配项。
为了更清楚:

打印出来:

1,4,3 # not 1,2,8 as  4 > 2
3,7,3
7,4,1

通过从元组ab 中获取(1,4) 并在bc 中找到它,然后打印bc

【问题讨论】:

  • 不确定您的问题到底是什么?
  • 请编辑问题以显示您的预期输出。
  • 我有,希望我的编辑有所帮助。在我完成问题之前,我不小心按了“提问”。对不起。 @MartinEvans
  • 为什么数字周围有括号?
  • 你应该有一个元素元组还是你的列表中有什么?还有({1:4, 3:7, 7:4})是怎么来的?

标签: python list dictionary tuples


【解决方案1】:

您希望保留具有最高第二个元素的元组用于重复键,其中键是压缩列表后每个元组的第一个元素,仅排序将意味着您保留最后一次看到/更高的值:

from collections import  OrderedDict

print(list(OrderedDict((sub[0], sub) for sub in sorted(zip(a, b, c))).values()))
[(1, 4, 3), (3, 7, 3), (7, 4, 1)]

排序时:

In [8]: sorted(zip(a, b, c))
Out[8]: [(1, 2, 8), (1, 4, 3), (3, 7, 3), (7, 4, 1)]

您会在列表后面获得“更高的值”,因此默认情况下,我们将始终保留最大的重复键的值。

【讨论】:

  • 你也可以这样使用:abc = sorted(zip(a, b, c)); filtered = {a: (a, b, c) for (a, b, c) in abc}; print sorted(filtered.values())
  • @mfripp,你可以,但是为什么排序两次就可以了?
  • 我想我只是喜欢坚持使用内置类型和使用字典理解的想法,并且我模糊地怀疑 OrderedDict 会在我添加条目时对其进行排序。我应该检查文档,我会发现 OrderedDict 是在添加条目时排序的,而不是按字典顺序排序的,所以它不会添加额外的排序。顺便问一下,list(dict.values()) 和 dict.values() 不一样吗?
  • @mfripp,取决于python版本,.values在python3中返回一个dictview对象所以你需要调用list所以我只是用它来覆盖这两种情况
  • 帕德拉克,谢谢。每天都有新东西要学!
猜你喜欢
  • 2016-01-03
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2019-08-27
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多