【问题标题】:iteration with map() function使用 map() 函数进行迭代
【发布时间】:2020-10-18 21:21:40
【问题描述】:

我正在尝试使用 map() 函数并将列表中的所有单词大写。

my_pets = ['sisi', 'bibi', 'titi', 'carla']

def capitalizing(a):
    for item in a:
        b = item.upper()
        return b

print(list(map(capitalizing, my_pets)))

如果我运行这段代码,我会得到如下输出:

['S', 'B', 'T', 'C']

这是为什么呢?为什么代码只运行第一个字母并为每个单词停止?

我已经知道“for”循环/迭代不正确,无法获取所有单词,我不需要它,但是为什么这个循环会针对每个单词的第一个字母运行?

提前感谢您的帮助。

【问题讨论】:

  • @rodny9 我修正了你的代码格式,你能确认这是你的缩进吗?
  • 如果你使用map(),则不需要使用for循环
  • map 在给它(字符串元素)大写之前已经在迭代每个元素。 for item in a: 对字符串的字符进行迭代。 return b 在第一次迭代时立即返回第一个字符,在一次迭代后退出函数
  • print(list(map(str.upper, my_pets)))
  • 你可以使用列表理解,[x.upper() for x in ['sisi', 'bibi', 'titi', 'carla']]

标签: python python-3.x function dictionary capitalize


【解决方案1】:

return 返回值并退出函数。通常你会想使用yield 来返回多个值,但实际上你根本不需要循环:

def capitalizing(a):
    return a.upper()

事实上你甚至不需要capitalizing,因为它只是str.upper的一个包装器:

>>> print(list(map(str.upper, my_pets)))
['SISI', 'BIBI', 'TITI', 'CARLA']

或者更好的是,使用列表推导:

>>> print([s.upper() for s in my_pets])
['SISI', 'BIBI', 'TITI', 'CARLA']

【讨论】:

    【解决方案2】:

    map 的作用是为您处理输入序列上的迭代位,因此您提供给map 的函数应该以这样的方式定义:它包含 序列中只有一个元素作为参数。

    它在 OP 中提供的方式,map 采用原始列表的每个元素(即名称)并依次将 capitalizing 应用于每个元素。但是,该函数在内部循环其参数(在本例中是名称字符串中的字符)并返回每个名称中第一个字符的大写。 (你明白为什么吗?)

    正如其他人所建议的,有更简单/更简洁的方法可以实现这一点,但如果您想了解map 的工作原理,请删除for 循环并简单地返回a.upper()

    【讨论】:

      【解决方案3】:

      更容易理解地图的方法,

      print(list(map(lambda s: s.upper(), ['sisi', 'bibi', 'titi', 'carla'])))
      

      【讨论】:

      • I hate list(map(lambda))。请改用列表理解:print([s.upper() for s in my_pets])。更短更干净,对吧?
      • 时间复杂度不同。阅读此https://leadsift.com/loop-map-list-comprehension/
      • 该页面说列表组合比地图快,除了“需要结果 O(n)”,差异很小。这些结果似乎也适用于 Python 2。我不知道 Python 3 中的情况是否发生了变化,但对list 的额外转换可能会增加一些开销。
      • 构造map 对象可能还需要一些开销。
      • 发现这个方法“(λx.x) List”非常接近map方法。
      【解决方案4】:

      您在 for 循环中放置 return 会导致它在第一次迭代后返回(在传递给大写的字符串的第一个字符上)。例如:
      capitalizing('sisi')

      for item in a:     # a = 'sisi'
        b = item.upper() # item = 's', b = 'S'
        return b         # b = 'S', return 'S' and exit function
      

      正如其他答案所示,代码可以更简洁地编写。这段代码做的事情是多余的。

      这是您的代码的固定版本,在 for 循环完成构建字符串后返回,而不是在第一次迭代后返回:

      my_pets = ['sisi', 'bibi', 'titi', 'carla']
      
      def capitalizing(a):
          b = ""
          for item in a:
              b += item.upper()
              # using return here will exit the function immediately after the first iteration
          return b # return after finishing
      
      print(list(map(capitalizing, my_pets)))
      

      【讨论】:

        猜你喜欢
        • 2019-05-24
        • 2021-05-22
        • 2020-02-06
        • 1970-01-01
        • 2013-05-20
        • 2018-07-01
        • 2020-03-27
        • 2021-06-23
        • 1970-01-01
        相关资源
        最近更新 更多