访问嵌套字典时代码的差异

时间:2018-05-20 02:13:27

标签: python

def extract_full_name(names):

    firstname = []
    lastname = []
    for z in range(0,len(names)):
        firstname.append(names[z]['first'])
    for k in range(0,len(names)):
        lastname.append(names[k]['last'])

    return list(zip(firstname,lastname))

VS

def extract_full_name(l):
     return list(map(lambda val: "{} {}".format(val['first'], val['last']), l))

所以我在udemy上做这个课程,它要求我做这样的事情:

names = [{'first': 'Elie', 'last': 'Schoppik'}, {'first': 'Colt', 'last': 'Steele'}]
extract_full_name(names) # ['Elie Schoppik', 'Colt Steele']

我的代码和Colt的解决方案有什么区别

3 个答案:

答案 0 :(得分:1)

让我们以你所做的为基础:

  1. 在python中,序列可以使用for循环进行迭代。当您不需要索引时,请不要计算它:

    def extract_full_name(names):
        firstname = []
        lastname = []
        for item in names:
            firstname.append(item['first'])
        for item in names:
            lastname.append(item['last'])
        return list(zip(firstname,lastname))
    
  2. 要简单地从另一个列表生成列表,您可以使用list comprehension

    def extract_full_name(names):
        firstname = [item['first'] for item in names]
        lastname = [item['last'] for item in names]
        return list(zip(firstname,lastname))
    
  3. 由于您迭代两次相同的序列,我们也可以通过组合来避免zip

    def extract_full_name(names):
        return [(item['first'], item['last']) for item in names]
    
  4. 现在,让我们解决输出中的错误:将每个全名输出为包含两个字符串(名字和姓氏)的2元组。让他们format改为全名:

    def extract_full_name(names):
        return ['{} {}'.format(item['first'], item['last']) for item in names]
    

    该版本几乎让您感到困惑,但它使用列表推导而不是map

  5. [bonus] 由于我们使用格式,我们也可以使用其rich syntax来访问项目的条目:

    def extract_full_name(names):
        return ['{name[first]} {name[last]}'.format(name=item) for item in names]
    

答案 1 :(得分:0)

在这两种情况下,您都必须以某种方式遍历names列表。

你这样做的方法是迭代一次得到所有的名字,然后再次迭代得到所有的姓氏 - 然后你把第一个名字和相应的姓氏放在一个元组中并返回一个元组列表。

第二个函数只迭代一次,它使用map函数执行此操作。在map函数中,有一个lambda函数将应用于列表的每个项目。 lambda函数从列表中获取字典val,并将名字和姓氏放在一个字符串中,用空格分隔:

a = "Hello"
b = "world!"
string = "{} {}".format(a, b)

string现在等于"Hello world!"。对于列表中的每个字典重复此操作,其中a是名字,b是姓氏。然后将地图对象转换为列表并返回。

输出中的关键区别在于,您返回的是元组列表,而不是字符串列表。要解决该问题,请从以下位置修改函数的结尾:

return list(zip(firstname,lastname))

到此:

return [" ".join(names) for names in zip(firstname,lastname)]

答案 2 :(得分:0)

我更愿意这样做:

names = [{'first': 'Elie', 'last': 'Schoppik'}, {'first': 'Colt', 'last': 'Steele'}]
fullnames = [f"{n.get('first', '')} {n.get('last', '')}" for n in names]