[Python] 字典中append的使用问题, setdefault如何应用?
题目描述
有男生和女生的名字,首字母不同,希望找到首字母相同的人,然后进行配对,同字母的配对在一起
题目来源及自己的思路
Python基础教程第三版Page 83
相关代码
girls = ['Alice','Bernice','Clarice']
boys = ['Chris','Arnhold','Bob']
letterGirls = {}
for girl in girls:
#这个里头找了第一个字母是键,第二个是值
letterGirls.setdefault(girl[0], []).append(girl)
print([b+'+'+g for b in boys for g in letterGirls[b[0]]])
你期待的结果是什么?实际看到的错误信息又是什么?
在 letterGirls.setdefault(girl[0], []).append(girl) 这一行中,代码首先声明了letterGirls = {},链式调用的执行顺序是从左到右所以setefault(girl[0],[])时候输出的应该是在letterGirls字典中插入了girl[0], 然后append(girl)插入了值。这个能够明白,结果是:
['Chris+Clarice', 'Arnhold+Alice', 'Bob+Bernice']
是合理且符合预期的结果。但是为什么不能改成:
letterGirls.setdefault(girl[0], girl)
这个输出:
['Chris+C', 'Chris+l', 'Chris+a', 'Chris+r', 'Chris+i', 'Chris+c', 'Chris+e', 'Arnhold+A', 'Arnhold+l', 'Arnhold+i', 'Arnhold+c', 'Arnhold+e', 'Bob+B', 'Bob+e', 'Bob+r', 'Bob+n', 'Bob+i', 'Bob+c', 'Bob+e']
很明显这个不是想要的结果。
其他补充:二者在print(letterGirls)中的输出结果分别是:
{'A': ['Alice'], 'B': ['Bernice'], 'C': ['Clarice']}
和
{'A': 'Alice', 'B': 'Bernice', 'C': 'Clarice'}
这二者有什么区别呢?
回复
1个回答

test
2024-07-18
前者字典中的值为列表,后者字典中的值为字符串差异来自遍历形式,列表遍历是依次取出列表元素,而字符串是依次取出其中字符
for i in ['Alice']: print(i) # Alice
for i in 'Alice': print(i) # A, l, i, c, e
对于后一种方法可以考虑相应修改打印的列表解析式以达到相同效果:
print([b+'+'+letterGirls[b[0]] for b in boys])
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容