python题的答案代码看8懂

给定:一个包含名称散列的数组
返回: 一个字符串,格式为以逗号分隔的名称列表,最后两个名称除外,最后两个名称应由&分隔。

return那一行看8懂,解释1下

def namelist(names):
  return ", ".join([name["name"] for name in names])[::-1].replace(",", "& ",1)[::-1]
print(namelist([{'name': 'Bart'},{'name': 'Lisa'},{'name': 'Maggie'},{'name': 'Homer'},{'name': 'Marge'}]))

应该返回Bart, Lisa, Maggie, Homer & Marge

挺简单的,想要看懂主要在于两点:[::-1]是字符串逆序,replace()第三个参数指定替换的次数。
这行代码最开始生成纯用逗号分割的字符串,因为要把最后一个逗号找出来,所以就先逆序,然后用replace替换一次"&"符号,然后在逆序回正常的字符串


1)
[name["name"] for name in names] ,表示把 names 这个字典的所有 'name' key的值存为一个数组
>>> names=[{'name': 'Bart'},{'name': 'Lisa'},{'name': 'Maggie'},{'name': 'Homer'},{'name': 'Marge'}]
>>> [name["name"] for name in names]
['Bart', 'Lisa', 'Maggie', 'Homer', 'Marge']

2)
", ".join(...) 把...数组的元素用', '拼接成字符串
", ".join([name["name"] for name in names])
==> 字符串 
>>> ', '.join([name["name"] for name in names])
'Bart, Lisa, Maggie, Homer, Marge'

3) ‘string_value’[::-1].replace(",", "& ",1)[::-1]
这是非人类的写法, 
3.1) ‘string_value’[::-1] 把 这个字符串按每个字符倒序显示
>>> 'Bart, Lisa, Maggie, Homer, Marge'[::-1]
'egraM ,remoH ,eiggaM ,asiL ,traB'
3.2).replace(",", "& ",1) 把','替换为'&', 仅替换一次,也就是只替换第一个
>>> 'egraM ,remoH ,eiggaM ,asiL ,traB'.replace(",", "& ",1)
'egraM & remoH ,eiggaM ,asiL ,traB'
3.3)最右边的[::-1],把字符串再倒序一次 ==> 字符串复原了
>>> 'egraM & remoH ,eiggaM ,asiL ,traB'[::-1]
'Bart, Lisa, Maggie, Homer & Marge'

[::-1].replace(",", "& ",1)[::-1] 这一串,用正常人类的写法,写个rreplace函数( 从右到左replace),一样的效果
>>> def rreplace(s, old, new):
...     try:
...         place = s.rindex(old)
...         return ''.join((s[:place],new,s[place+len(old):]))
...     except ValueError:
...         return s
>>> rreplace('Bart, Lisa, Maggie, Homer, Marge', ',', '& ')
'Bart, Lisa, Maggie, Homer&  Marge'