python 中字典键的差分运算

Difference operations in dictionary keys in python

我正在 运行使用 IDLE 编写一些 Python3 代码,我想了解为什么

a = {'a':1,'b':2}

两者:

a.keys()-'a'

(甚至不知道为什么这个有效)和

a.keys()-{'a'}

产生相同的结果。


奇怪的是,一旦在函数内部执行操作(并从 IDLE 调用)或直接从 IDLE 运行 执行操作,第二个选项似乎会产生不同的输出...

字符串是可迭代的字符 – set('abc') == {'a', 'b', 'c'}。字典键的 - 运算符接受任何可迭代对象,因此 'a' 等同于 {'a'} 那里。

如果您使用更长的字符串,它似乎不再有效。

这里要了解的是要减去的实体种类。

a.keys() 是可迭代的。这只是意味着它可以通过使用 foriter 进行迭代。正式地说,在 python 中,任何东西都是实现 __iter__ 函数的可迭代对象。检查这个 link

>> type(a.keys)
>> dict_keys

dict_keys 是一个可迭代对象,你怎么知道的?因为它有一个属性 __iter__.

>> hasattr(a.keys() , '__iter__')
>> True

a.keys() returns 一个 view 对象。这允许您从自身中减去其他可迭代对象。如文档中所述:

dictview - other
Return the difference between the dictview and the other object (all elements in dictview that aren’t in other) as a new set.

因此,要从 a.keys() 中减去某些内容,该实体也应该是可迭代的。

你的情况:

  1. a.keys() - 'a' 有效,因为字符串在 python

    中是可迭代的

    >> hasattr('a' , '__iter__')

    >> True

    所以,字符串是可迭代的

  2. a.keys() - {'a'} 有效,因为 {'a'} 是一个集合,它是一个可迭代的

    >> hasattr({'a'} , '__iter__')

    >> True

另一方面,如果您尝试这样做:

>> a.keys() - 1
>> TypeError: 'int' object is not iterable

所以,你不能减去两个不可迭代的对象。 希望这会有所帮助:)