【问题标题】:Str in Python's map and sumPython中的str映射和求和
【发布时间】:2009-10-10 02:13:21
【问题描述】:

为什么需要在下面的代码中使用函数'str'?

我正在尝试计算数字中的数字总和。

我的代码

for i in number:
    sum(map(int, str(i))

其中 number 是下面的数组

[7,79,9]

我阅读我的代码如下

  1. 遍历数组,这样
  2. 整数位数的总和
  3. 通过ma​​p越来越多地获得数字中的数字
  4. 这样每个对象(给定的数字)都被转换为字符串//这没有意义

手册说 str

Type:           type
Base Class:     <type 'type'>
String Form:    <type 'str'>
Namespace:      Python builtin
Docstring:
    str(object) -> string

    Return a nice string representation of the object.
    If the argument is a string, the return value is the same object.

【问题讨论】:

  • 这段代码你需要明白的是,字符串是字符序列,map() 也是这样做的。
  • 哦,那 int('5') 将返回整数 5。

标签: python string


【解决方案1】:

给定79,您需要得到[7, 9] 才能总结此列表。

将数字拆分为数字是什么意思?这意味着用某个基数(在本例中为基数10)表示数字系统中的数字。例如。 797 * 10**1 + 9 * 10**0

获得这样一个数字表示的最简单(嗯,至少在这种情况下)方法是什么?把它转换成一串小数!

您的代码正是这样做的:

>>> str(79)
'79'

# Another way to say this is [int(c) for c in str(79)]
>>> map(int, str(79))
[7, 9]

>>> sum(map(int, str(79)))
16

【讨论】:

  • 我发现“字符串”是 Python 中不可变的字符序列,因此您首先需要一个新字符串来进行编辑。 - 但是,当它是示例中的新输入时,为什么需要使用 strfor 79 对我来说没有意义。 - 我想知道你什么时候不需要在给定示例中使用函数str
  • 您的意思是转换为十进制数可以计算总和吗? - 这对我来说很有意义,因为整数是唯一的,而小数是非唯一的。这将允许很容易地为不同的十进制表示有许多指针,这对于整数是不可能的。
  • 数字只是数字。您可以添加或减去它们。但是,只要您没有将数字定义为某个数字系统中数字表示中的系数,就没有数字这样的东西。您可以编写一个函数num_to_digits,它接受int 和数字系统基数,并返回listints。但是你可以重用str,它在内部做a)这件事,b)从int数字到str的转换。
  • 问题:“我想知道你什么时候不需要在给定的例子中使用函数`str”回答:当i是一个序列时。
【解决方案2】:

如果您在不使用 str() 的情况下尝试该代码会发生什么?

str() 用于将整数转换为字符序列,以便map() 可以遍历该序列。这里的重点是“字符串”可以被视为“字符序列”。

【讨论】:

  • 你怎么看map()需要字符作为输入? - 它在手册中说 map(function, sequence[, sequence, .. .]) -> 列表。 - 序列的数据类型是什么? - 序列似乎可能只包含字母,而不是数字。
  • 在类型更完善的语言中,map 的类型为:forall a. (a -&gt; b), list(a) -&gt; list(b)。 Python 中的序列(实际上是Iterable)是具有__iter__ 方法返回另一个称为Iterator 的东西的东西。迭代器具有相同的 __iter__next 来执行实际迭代。
  • “一个序列似乎可能只包含字母,而不是数字。”不。数字序列是完全可能的,例如 (1,2,3,4,5)。
  • 而且,有必要记住数字(整数,如数学概念)和字符(可能是字母、数字、标点符号或其他字符)之间的区别。
【解决方案3】:

为什么需要在下面的代码中使用函数'str'?

因为 map 需要一个可迭代对象,例如列表、元组或字符串。

有问题的代码将整数中的所有数字相加。它通过一个小聪明的技巧来做到这一点。它通过执行将数字转换为数字序列

map(int, str(i))

这会将整数 2009 转换为列表 [2, 0, 0, 9]。然后 sum() 将所有这些整数相加,得到 11。

一个不那么老套的版本是:

>>> number = [7,79,9]
>>> for i in number:
...     result = 0
...     while i:
...         i, n = divmod(i, 10)
...         result +=n
...     print result
... 
7
16
9

但你的版本无疑更聪明。

【讨论】:

  • 是的,但是你应该基本上抽象出这样的代码,例如函数digits(number, base) -&gt; [int]sum
  • 如果您打算多次使用它,可以。
  • 您的代码似乎有问题。一开始似乎需要i = 0; while i &lt; something。但是,我无法使用这些更改。
  • 它只需要 i 是某种整数,就像你的问题一样。而已。没有错误。我再次检查了一遍。
  • 叹息。我使用了与您完全相同的变量名称。为了更加清晰,我更新了我的帖子。
猜你喜欢
  • 2012-06-06
  • 2020-09-29
  • 1970-01-01
  • 2018-01-28
  • 2017-10-24
  • 2012-07-11
  • 2011-12-08
  • 1970-01-01
  • 2020-10-27
相关资源
最近更新 更多