使用单个字符与字符串原子设置差异?

时间:2016-02-13 22:26:50

标签: python set

我试图绕过为什么我使用组差来从多个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'])

我不明白为什么他们的行为应该有所不同。

2 个答案:

答案 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'])),你会看到你的期望。