1.贴题

题目来自PythonTip


给你一字典a,如a={1:1,2:2,3:3},输出字典a的key,以’,’连接,如‘1,2,3’。要求key按照字典序升序排列(注意key可能是字符串)。

例如:a={1:1,2:2,3:3}, 则输出:1,2,3


2.说明

要解决以下三个问题
1. 如何访问字典的key
2. 如何将key升序排列
3. 如何按照逗号分隔的形式输出

3.参考代码

ls = [] #创建空列表备用
for key in a: #遍历字典a获取key
    ls.append(key) #将获得的key添加到空列表

ls.sort() #将装有全部key的列表升序排列
print(",".join(str(i) for i in ls)) #以逗号分隔将列表的所有元素输出

4.其他写法

本来以为这次的代码很优雅了,结果看了大家的代码发现差距还是很大啊。。。
开启吐槽模式吐槽一下我自己→→

吐槽之一:输入字典输出字符串何必中间非经过列表?直接用字符串不好嘛

b=''
for k in sorted(a.keys()):
    b += str(k)
print(','.join(b))

吐槽之二:数数你的代码行数,再数数下面的代码呗?

print(','.join(map(str, sorted(a.keys()))))

5.常见问题分析

1. sort()函数和sorted()函数

sorted(a)
print(",".join(str(key) for key in a.keys()))

错误分析:初学者要特别注意sort()函数和sorted()函数的区别,前者是直接对原列表进行操作,而后者是产生一个新列表而原列表不变,所以上面的代码肯定就不会正确了,因为第一行代码什么作用也没有。
另外注意到一般sort()函数和sorted()函数都是对列表进行操作,而上面这个同学对字典实行了该操作,那么结果会怎么样呢?看代码

a={2:1,1:2,3:4} #定义字典a

b = sorted(a) #对a进行sorted()操作
print(a) #打印a
print(b) #打印b
a.sort() #对a进行sort()操作
print(a) #打印a

输出为

{2: 1, 1: 2, 3: 4} #a字典在sorted()操作没有改变
[1, 2, 3] #sorted()操作后的b只保留了key

Traceback (most recent call last):
  File "jdoodle.py", line 6, in <module>
    a.sort()
AttributeError: 'dict' object has no attribute 'sort' #字典不能进行sort()操作
Command exited with non-zero status 1

2. 注意类型

print(','.join(sorted(a.keys())))

错误分析:如果key是字符串上面的代码是可以通过的,但是如果key不是字符串呢,就会出现下面这种错误

Traceback (most recent call last):
  File "jdoodle.py", line 3, in <module>
    print (','.join(sorted (a.keys())))
TypeError: sequence item 0: expected str instance, int found   #join只能连接字符串
Command exited with non-zero status 1

3. 切片的格式

a = list(a.keys())
a.sort()
a = str(a)
print(a[1:8])

错误分析:上面这段代码看起来很巧妙,使用了切片进行输出。但是有一个坑,就是切片输出确实使用逗号分隔的,但!不!是!纯!逗!号!来比较一下

1,2,3 #这是正确输出
1, 2, 3 #这是切片输出

所以知道问题出在哪儿了吧,切片输出是以“, ”(英文逗号加英文空格)分隔的。

6.后记

最后出个脑筋急转弯:字符串能不能用sort()或者sorted()函数?