我试图绕过为什么我使用组差来从多个Pythons得到不同的结果,这取决于set atom是单字符串还是倍数:
x = {'a': 1234, 'b': 2345, 'c': 9998}
y = set(x.keys())
w = {'aa': 1234, 'bb': 2345, 'cc': 9998}
z = set(w.keys())
print('c' in y)
print(y.difference('c'))
print(y.difference(set('c')))
print('cc' in z)
print(z.difference('cc'))
print(z.difference(set('cc')))
产地:
True
set(['a', 'b'])
set(['a', 'b'])
True
set(['aa', 'cc', 'bb'])
set(['aa', 'cc', 'bb'])
我不明白为什么他们的行为应该有所不同。
答案 0 :(得分:2)
如果您阅读了文档,则会发现set()
构造函数需要iterable
。由于python字符串是可迭代的,因此set('x')
实际上与set('xxxxx')
相同:
set('x') == set('xxxx')
True # yes, they are the same
在您的情况下,您可能需要set(['c'])
和set(['cc'])
。
答案 1 :(得分:2)
这是因为a.difference
期望从a
中删除可迭代的元素。因此,当您调用y.difference('c')
时,Python会生成一个等同于y
但不包含'c'
的集合。另一方面,当您调用z.difference('cc')
时,Python会生成相当于z
但不包含'c'
且不包含'c'
的集合(例如,它会迭代要删除的元素的'cc'
字符串。
正如@jonrsharpe所提到的,set('cc')
是一个包含一个元素'c'
,而不是'cc'
的集合。如果您想要一个以'cc'
为元素的集合,则必须以类似于set(['cc'])
的方式构造它。如果你运行z.difference(set(['cc']))
,你会看到你的期望。