【问题标题】:Why can't I concatenate items in this list but I can multiply them?为什么我不能连接此列表中的项目,但我可以将它们相乘?
【发布时间】:2017-05-22 12:30:06
【问题描述】:

我有一个将项目包含在撇号中的列表,我可以使用以下“for循环”

list1 = ['1','2','3']
list2 = [i * 5 for i in list1]
print list2

似乎将列表项视为数字,但是当我将乘号更改为加号时:

list1 = ['1','2','3']
list2 = [i + 5 for i in list1]
print list2

我收到错误“无法连接 'str' 和 'int' 对象”。如果列表项是字符串,我不应该将它们相乘。既然我可以,它们必须是数字,那么为什么我不能向它们添加任何东西呢?

编辑:有人能告诉我为什么这个问题不好吗?我已经阅读了发帖规则,但即将被踢,因为我收到了很多负面反馈,但我只是一个初学者,正在尽我所能写。

【问题讨论】:

  • 当你打印 list2 时,它应该是这样的:['11111', '22222', '33333']。乘法只是复制字符串,所以它不会像 int 一样对待它。
  • 在python中你可以将一个字符串相乘以重复多次
  • 感谢您的反馈。我已经在大量代码上工作了好几个小时,只是专注于错误代码而不是进行数学运算并意识到它实际上并没有计算出我认为的那样。
  • @Davy 我不同意,但理解问题的最佳方法是将其分解为各个组成部分......他们使用列表的方法没有奏效,所以下一步将是放弃名单。我不是在指责他们(对不起,如果是这样的话),而是试图展示一种可以用来解决大量问题的方法,并试图回答为什么人们会认为它是“穷人” '问题。
  • 这本身并不“坏”,但事实上您提出了这个问题并包含了错误的假设,这些假设被断言为对函数结果的实际观察(似乎将列表项视为数字 i>) 表明您没有花费 30 秒在控制台中执行这 3 行代码。如果你这样做了,你的问题将是一个非常不同的问题,你可能会发现为什么运算符在文本序列上以这种方式工作。

标签: python string list


【解决方案1】:

在第一个例子中你不能乘以数字:如果你乘以一个字符串,你重复这个字符串n次,比如:

>>> "foo"*5
'foofoofoofoofoo'

所以你的第一个代码片段导致:

>>> [i * 5 for i in list1] # see, you repeat the string
['11111', '22222', '33333']

不支持strings 和ints 之间添加,所以会出错。可能是因为唯一合理的操作是将数字添加到字符串的末尾,但这又不是 numerical 添加。

如果你想做数值计算,你必须先用int(..)把它转换成int

>>> [int(i) * 5 for i in list1]
[5, 10, 15]
>>> [int(i) + 5 for i in list1]
[6, 7, 8]

如您所见,这里的结果是一个带有ints 的列表(数字周围没有引号)。

当您将它们与整数相乘时,大多数序列(列表、元组、字符串等)将构造相同类型的重复序列。喜欢:

>>> [1,'a',2,"five"]*3
[1, 'a', 2, 'five', 1, 'a', 2, 'five', 1, 'a', 2, 'five']
>>> (1,'a',2,"five")*3
(1, 'a', 2, 'five', 1, 'a', 2, 'five', 1, 'a', 2, 'five')

【讨论】:

    【解决方案2】:

    在命令行上试试这个:

    >>> '1' * 5
    '11111'
    >>> '1' + 5
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: cannot concatenate 'str' and 'int' objects
    

    这是你所期望的吗?应该不会吧……


    如果要进行计算,则需要执行以下操作:

    >>> int('1') * 5
    5
    >>> int('1') + 5
    6
    

    这两个结果都是ints,而不是strs。


    如果要进行字符串连接,则需要执行以下操作之一:

    >>> '1' + '5'
    '15'
    >>> '1' + str(5)
    '15'
    

    【讨论】:

      【解决方案3】:

      '2' * 5 将返回 '22222' 作为字符串,而不是您想象的 10。

      您应该转换变量int(i) + 5,这会将 i 视为整数而不是字符串。

      【讨论】:

        【解决方案4】:

        '1' * 5 会给你'11111',而不是5。 您可以将字符串和整数相乘。但是,您不能添加字符串和整数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-26
          • 1970-01-01
          • 2010-12-25
          • 2023-03-03
          • 2015-11-10
          • 1970-01-01
          • 1970-01-01
          • 2013-10-10
          相关资源
          最近更新 更多