【问题标题】:list index out of range when using map()使用 map() 时列表索引超出范围
【发布时间】:2017-03-23 23:37:57
【问题描述】:

我尝试使用带有 1 个预定函数和 1 个参数的 map 函数。一切正常,直到我在 map 函数上调用 list() 。最后它显示了

IndexError: 列表索引超出范围

但是当我简单地调用列表中的函数而不使用 map() 时,没关系。任何人都可以尝试帮助我识别错误吗?


people = ['Dr. Christopher Brooks', 'Dr. Kevyn Collins-Thompson', 'Dr. VG Vinod Vydiswaran', 'Dr. Daniel Romero']

def split_title_and_name(person):

    name_list=[]

    for i in person:
        i = i.split()[0]+" "+i.split()[-1]
        name_list.append(i)

    return name_list 

split_title_and_name(people)
list(map(split_title_and_name, people))

【问题讨论】:

  • 你能修正你的缩进吗? map 获取每个人并应用函数split_title_and_name()split_title_and_name('Dr. Chistopher Brooks') 与发送姓名列表非常不同。
  • 您的函数似乎旨在直接获取名称的可迭代。如果您将map 转到people,它当然会抛出错误,因为当您迭代for i in person 时,它会遍历单个名称 的各个字符。当i 到达空间" " 然后split 返回并清空列表[] 并索引到空列表将抛出IndexError

标签: python list dictionary indexing split


【解决方案1】:

这些不是相同的功能。您的函数在人员列表上运行。 ma​​p 将该函数应用于people 的每个元素。因此,您正在调用

split_title_and_name('Dr. Christopher Brooks')
split_title_and_name('Dr. Kevyn Collins-Thompson')
...

看到问题了吗?

【讨论】:

    【解决方案2】:

    您的函数split_title_and_name 适用于人员列表,而您希望它一次只对一个人起作用:

    def split_title_and_name(person):
        return person.split()[0] + " " + person.split()[-1]
    

    【讨论】:

      【解决方案3】:

      这里有一个更好的解决方案:

          people = ['Dr. Christopher Brooks', 'Dr. Kevyn Collins-Thompson', 'Dr. VG Vinod Vydiswaran', 'Dr. Daniel Romero']
      
      def split_title_and_name(person):
          title = person.split()[0]
          lastname = person.split()[-1]
          return '{} {}'.format(title, lastname)
      
      list(map(split_title_and_name, people))
      

      当我使用格式化函数时,它看起来不那么复杂了。

      【讨论】:

        【解决方案4】:

        以防万一您打算在“繁重”上使用该功能并希望避免重复拆分调用...也许您应该首先尝试存储拆分后的字符串...尝试:-)

        people = ['Dr. Christopher Brooks', 'Dr. Kevyn Collins-Thompson', 'Dr. VG Vinod Vydiswaran', 'Dr. Daniel Romero']
        
        def split_title_and_name(person):
        
            splitted_string = people.split() 
            title = splitted_string[0]
            lastname = splitted_string[-1]
            return '{} {}'.format(title, lastname)
        
        list(map(split_title_and_name, people))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-19
          • 2018-12-16
          • 2011-06-14
          • 2016-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多