【问题标题】:Python: Sum string lengthsPython:求和字符串长度
【发布时间】:2020-05-30 18:16:27
【问题描述】:

在 Python 中,有没有比使用循环更惯用的方法来求和字符串长度?

length = 0
for string in strings:
    length += len(string)

我试过sum(),但它只适用于整数:

>>> sum('abc', 'de')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]

【问题讨论】:

  • “更快”是什么意思?更少的输入或更快的执行?
  • @Richard:对不起,我想“更快”是因为打字少,但我的意思是惯用的。
  • 不用担心。我想其他人都是这么想的。我只是个书呆子!

标签: python list sum


【解决方案1】:
length = sum(len(s) for s in strings)

【讨论】:

  • 这绝对是一种更惯用的表达方式,但我认为它在计算上不会更有效。尽管如此,为优雅和 Pythonicness +1!
  • 如果你真的担心计算效率,你可能不应该使用 Python,或者应该用 C 或 C++(或者 SciPy 的 weave 库,如果你有勇气的话)编写计算密集型部分。我喜欢这种风格,因为它对其他 Python 开发人员来说更易读。
  • 谢谢,这比我的代码更短更容易理解。
【解决方案2】:

我的第一个方法是sum(map(len, strings))。另一种方法是使用其他答案发布的列表理解或生成器表达式。

【讨论】:

  • 很好的答案,但我接受了liori's answer,因为我发现它更符合习惯。
  • @Josh:大多数人确实会发现 genexp 更 Pythonic。为了完整起见,我只是想添加它。
【解决方案3】:

最短最快的方法是使用functional programming stylemap()sum()

>>> data = ['a', 'bc', 'def', 'ghij']
>>> sum(map(len, data))
10

在 Python 2 中,使用 itertools.imap 代替 map 以获得更好的内存性能:

>>> from itertools import imap
>>> data = ['a', 'bc', 'def', 'ghij']
>>> sum(imap(len, data))
10

【讨论】:

    【解决方案4】:

    我知道这是一个老问题,但我不禁注意到 Python 错误消息告诉你如何做到这一点:

    TypeError: sum() can't sum strings [use ''.join(seq) instead]
    

    所以:

    >>> strings = ['abc', 'de']
    >>> print len(''.join(strings))
    5
    

    【讨论】:

    • 在不必要的情况下连接字符串似乎很浪费,但是 +1 可以添加另一种解决问题的方法!
    • 我不知道——我早就不再怀疑代码对于非实时系统是否会浪费 CPU。但既然你提到了“少打字”,这看起来很紧张。
    • @Zaz 浪费?如果要相信timeit 模块,这是迄今为止三种解决方案中最快的。您接受的答案sum(len(s) for s in strings) 的速度是sum(map(len, strings)) 的三倍多,也几乎是sum(map(len, strings)) 的两倍。 (当然速度在 Python 中并不重要——如果你想要速度,你会使用 Pypy,正如俗话所说——但与其他的相比,完整的生成器表达式在 IMO 中也有点令人讨厌。)
    • 其他答案更通用和有用,因为它们也回答了当列表的元素类型不是字符串时的问题。
    • @aggieNick02 其他答案回答了一个没有被问到的问题!问题是关于字符串列表的,错误消息提供了答案。为什么要把事情复杂化?
    【解决方案5】:
    print(sum(len(mystr) for mystr in strings))
    

    【讨论】:

      【解决方案6】:

      这是使用运算符的另一种方式。不确定这是否比接受的答案更容易阅读。

      import operator
      
      length = reduce(operator.add, map(len, strings))
      
      print length
      

      【讨论】:

        【解决方案7】:

        只是为了补充......

        从存储为字符串的列表中添加数字

        nos = ['1','14','34']

        length = sum(int(s) for s in nos)

        【讨论】:

          猜你喜欢
          • 2011-08-05
          • 1970-01-01
          • 2018-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-04
          • 2021-04-20
          相关资源
          最近更新 更多