关于python:在字典的一行中打印具有相同值的不同键

Printing different keys that have same value in one row from a dictionary

本问题已经有最佳答案,请猛点这里访问。

这是一本示例字典。

1
example = {'a': 10, 'b': 12, 'c': 10, 'd': 12}

我想打印如下。

1
2
12 b, d
10 a, c

  • python反转/反转映射
  • 您的字典语法错误:它应该是example='a':10,'b':12,'c':10,'d':12
  • 欢迎使用堆栈溢出。请阅读如何提问
  • @阿兰费,谢谢你的欺骗目标。我要用这个结束它。
  • 它永远不会结束。这不是副本。操作员可能希望以这种格式打印数据,而不是简单地执行将导致该格式的操作。像这样的"复制品"每天有一百万个。这很荒谬,需要停止。就像你们都在寻找一个问题被认为是重复的方法:"这个问题需要递归吗?复制品!"不要介意"复制"的目标和原始的处理完全不同的问题,并寻求完全不同的结果。为了所有神圣的人的爱,让他们休息一下,
  • @Aaronbrandhagen我知道你来自哪里(这就是为什么我没有以dupe结束这个问题),但你必须承认这只是两个问题的一个简单组合,"我如何颠倒一个听写?"以及"如何打印以逗号分隔的值列表?".我添加了一个相关的副本。
  • Aran。我真的很感激你的反应。编程中的学习曲线是无与伦比的。没有比得上的了。模式不存在。这就是它所说的:代码。熟练的编码员和初学者(尤其是自学的)之间的知识鸿沟是难以理解的。对您来说,最简单、最基本的代码是从初学者身上删除数百/数千小时的工作,甚至对它有一个相当好的理解。编程是一个相互关联的抽象的银河网。随着添加更多层,难度呈指数级增长。…
  • 所以,对于初学者来说,一些琐碎的问题是另一个拼图——将另一个无模式的概念/范式塞进记忆中,并将它们与所学的其他材料联系起来,同时不断地陷入无意识、令人恼火的矛盾中,这些矛盾也需要保持记忆。如果我有任何意义,请告诉我。我讨厌通过文本进行这样的对话,所以很多东西可能会丢失,被误解。
  • 要点(抱歉,我对这个主题很感兴趣):代码中最小的差异是大多数情况下数百个条件/规则彼此移除的时间。而且,这些条件和规则对现有问题的影响远远不止一个。模式最终会被学习,但只有在曲线被超越之后。那个灵魂破碎的怪兽。到此为止?你知道你所知道的,用任何类型的地图或模式来构建你所知道的。所以,一旦基础知识对你来说变得基本,就不可能知道初学者是如何处理自己的学习网络的。


有两种方法可以解决这个问题。

高效:collections.defaultdict(list)

构造一个键和值颠倒的新字典。重要的是,您可以有重复的值,所以我们使用一个列表来保存这些值。肾盂入路采用collections.defaultdict

对于非常大的字典,这可能有很大的内存开销。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
example = {'a': 10, 'b': 12, 'c': 10, 'd': 12}

from collections import defaultdict

d = defaultdict(list)

for k, v in example.items():
    d[v].append(k)

for k, v in d.items():
    print(k, ' '.join(v))

10 a c
12 b d

手册:列表理解循环

这种方法计算效率很低,但需要较少的内存开销:

1
2
3
4
5
for value in set(example.values()):
    print(value, ' '.join([k for k, v in example.items() if v == value]))

10 a c
12 b d

  • 至少有人使用' '.join([])(listcomp in join)


这能实现你想要的吗?

1
2
for i in set(example.values()):
    print (i, [list(example.keys())[j] for j in range(len(example)) if list(example.values())[j]==i])