[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.6k
1 个回答

前者字典中的值为列表,后者字典中的值为字符串
差异来自遍历形式,列表遍历是依次取出列表元素,而字符串是依次取出其中字符

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])
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进