【问题标题】:Mapping a `string.join` with a list of strings returns unxpected list of strings使用字符串列表映射 `string.join` 会返回意外的字符串列表
【发布时间】:2012-03-15 01:15:51
【问题描述】:

我尝试了以下说明:

>>> values ['9', '31', '32']
>>> map('abc'.join, values)
and got:
['9', '3abc1', '3abc2']

但我期望:

['abc9', 'abc31', 'abc32']

为什么我错了?

为了记录,我绕过了它:

>>> map(lambda x: 'abc%s' % x, values)

但我仍然对第一个地图构造的行为感到困惑!

感谢所有有见地的回答。它们都是正确且有帮助的,所以我不得不掷骰子来选择接受哪个——我会接受其中任何一个;-)

【问题讨论】:

  • 后者也可以简单写成map('abc{0}'.format, values)

标签: python string list python-2.6


【解决方案1】:

你想要的是

["abc" + x for x in values]

str.join() 方法使用点之前的部分作为字符串,通过该字符串连接其他字符串的可迭代。这就是为什么

"abc".join(["12", "34"])

结果

"12abc34"

如果您只是将字符串作为可迭代对象传递,则各个字符就是该可迭代对象的项:

"abc".join("1234")

结果

"1abc2abc3abc4"

【讨论】:

    【解决方案2】:

    'abc'.join(l)在连接l中的项目时使用abc作为分隔符

    当将它映射到您的values 列表时,该方法会为values 中的每个项目调用一次。由于字符串在 Python 中是可迭代的,因此每个 char 都被用作一个项目。

    【讨论】:

      【解决方案3】:

      这将随后调用

      'abc'.join('9')
      

      给出'9',因为join的给定参数中只有一个元素,然后

      'abc'.join('31')
      

      因为'31'['3', '1'] 相似,所以结果是'3abc1' 等等。

      【讨论】:

        【解决方案4】:

        不知道你为什么会这样。您要求为值中的每个元素运行'abc'.join(x)。这些元素中的每一个都是一个字符串,它是可迭代的:实际上,它是一个字符列表。所以'abc'.join('31')'abc'.join(['3', '1']) 相同,它给出了你得到的结果。

        【讨论】:

          【解决方案5】:

          如果您只想连接字符串,请使用str + strstr.format(),并在字符串中使用正确的{}

          values = ['9', '31', '32']
          map('abc{}'.format, values)
          

          或者更简单的列表理解:

          values = ['9', '31', '32']
          ['abc{}'.format(v) for v in values]
          

          【讨论】:

            猜你喜欢
            • 2021-08-15
            • 1970-01-01
            • 1970-01-01
            • 2018-11-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多