首先看如下代码:

a = ['0234','abcd']
seta = set(a)

b = ['0234']
setb = set(b)

c = ('0234','abcd')
setc = set(c)

d = ('0234')
setd = set(d)

e= tuple(b)
sete = set(e)

print(type(a), ' , ', a,' , ',seta)
print(type(b), ' , ', b,' , ',setb)
print(type(c), ' , ', c,' , ',setc)
print(type(d), ' , ', d,' , ',setd)
print(type(e), ' , ', e,' , ',sete)

在pycharm里运行这段代码的结果如下:

python集合转换 python集合转换成元组_git

需要注意的是变量d和e,可以看到,一个字符串用()的方式定义到元组里,这时的变量d其实是一个字符串,不是元组,这时候把d转换成集合,可以看到,字符串已经被拆分成单个字符了,这说明,如果把字符串转换成集合,那就会把字符串拆分成单个字符,并作为集合的元素

我们再来看变量e,它是由一个字符串组成的列表b经过tuple转换成元组的,可以看到这时的变量e是一个元组,不是一个字符串了,这是与变量d的一个最大区别,接下来把变量e转换成集合,可以看到字符串作为集合里的一个元素,没有被拆分。而且列表b转换成集合,也是字符串作为集合里的一个元素,没有被拆分。

通过这个程序例子,你可以发现:

1.通过()和tuple这两种方式定义元组,得到的结果可能是不同的,比如上面例子中的用一个字符串以()和tuple定义元组,结果却一个仍是字符串,一个是元组

2.一个字符串转换成集合,会把字符串拆分成字符并作为集合的元素,而用字符串组成的列表或元组,转换成集合时,却不会拆分字符串,而是把字符串作为集合的一个元素

总之,想要找出这种细微差别的原因,可能只有去查看Python的底层C++源码是怎么定义字符串、列表、元组、集合的了。

最近在使用paddleocr识别文字,在对识别文字里的数字做float类型转换的时候,发现了一个python里的判断字符串是否只由数字组成的函数isdigit的bug,程序示例如下:

a = '②'
b = '2'
print(a)
print(a.isdigit())
print(b)
print(b.isdigit())

运行这段代码后,可以看到,a和b在isdigit函数的返回都是True。