步骤/目录:
无

本文首发于个人博客https://lisper517.top/index.php/archives/4239/,转载请注明出处。
本文的原文写作日期为2020年9月6日。
本文的目的如标题所示。

《python基础教程第三版》第五章有一例:

girls = ['alice', 'bernice', 'clarice'] 
boys = ['chris', 'arnold', '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]]])

目的是配对首字母相同的boy与girl并据此创建列表。关键在于理解letterGirls.setdefault(girl[0], []).append(girl) 。
书上说append方法不能用于字典,看上去好像这一句错了。其实可以从左向右看:
letterGirls是一个字典,对字典使用setdefault方法,参数为(girl[0], []),即对girls列表中的每一个字符串元素,以其首字母为键查找字典中对应值,该键不存在则创建 首字母: [] 的项。setdefault返回的是值,也就是[]空列表,然后对空列表使用append方法,原位将空列表修改为[girl]。这一步后输出字典,得到:{'a': ['alice'], 'b': ['bernice'], 'c': ['clarice']}
最后一行,关键在于for g in letterGirls[b[0]]。以b的首字母为键得到值g,然后打印b+g。这里的问题是值g好像是一个一元字符串列表,列表和字符串是不能用+操作并输出的。但如果写print([type(g) for b in boys for g in letterGirls[b[0]]])就会发现,g的类型是str类。这是因为in操作,letterGirls[b[0]]才是一个一元字符串列表,for g in 字符串列表,那么就会得到这个字符串了。
上面的:

letterGirls.setdefault(girl[0], []).append(girl) 

也可以替换成:

letterGirls.setdefault(girl[0], [girl])

注意不能写成:

letterGirls.setdefault(girl[0], girl)

(这时for g in 字符串,则会输出一个一个的字符)
原因已在上面说明了。

标签: none

添加新评论