如何在python字典中检查冗余组合

use*_*241 3 python dictionary

我有以下python字典与元组的键和值:

{(A, 1): (B, 2),
 (C, 3): (D, 4),
 (B, 2): (A, 1),
 (D, 4): (C, 3),
 }
Run Code Online (Sandbox Code Playgroud)

如何在键和值之间获得一组独特的组合?这样(A,1):(B,2)看来,不是(B,2):(A,1)吗?

And*_*ark 7

d = {('A', 1): ('B', 2),
     ('C', 3): ('D', 4),
     ('B', 2): ('A', 1),
     ('D', 4): ('C', 3),
    }

>>> dict(set(frozenset(item) for item in d.items()))
{('A', 1): ('B', 2), ('D', 4): ('C', 3)}
Run Code Online (Sandbox Code Playgroud)

这通过将字典中的每个键/值对转换为集合来工作.这很重要,因为任何一对(a, b),set([a, b])等于set([b, a]).那么,如果我们能够获取所有这些键/值集并将它们添加到集合中,那将是完美的,这将消除所有重复项.我们不能用set类型做这个,因为它不可以使用,所以我们frozenset改用.内置dict()函数可以接受任何可迭代的键/值对作为参数,因此我们可以传入我们的键/值对集合,它将按预期工作.

关于这一点的评论中提出了一个很好的观点,如果有任何事情映射到自身会导致问题,例如,如果你有d[('A', 1)] = ('A', 1),要解决这个问题,你可以sorted()按照评论中的建议使用:

d = {('A', 1): ('A', 1),
     ('C', 3): ('D', 4),
     ('D', 4): ('C', 3),
    }

>>> dict(sorted(item) for item in d.items())
{('A', 1): ('A', 1), ('C', 3): ('D', 4)}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,对于任何重复项,排序顺序将始终为您提供"较小"的元素作为键,将"较大"作为值.

但是在Python 3.x中,如果键和值可能有不同的类型,则需要小心,因为sorted()除非iterable中的所有元素都是相同的类型,否则会引发异常:

>>> d = {1: 'A', 'A': 1}
>>> dict(sorted(item) for item in d.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <genexpr>
TypeError: unorderable types: int() < str()
Run Code Online (Sandbox Code Playgroud)

  • 如果有什么映射到自己,不会很有效.在这种情况下,可能会对每个键值对进行排序?`dict(d.iteritems()中项目的排序(项目)`. (2认同)