【问题标题】:Sum all numbers in a list of strings对字符串列表中的所有数字求和
【发布时间】:2026-02-10 05:55:01
【问题描述】:

对不起,如果这是一个非常菜鸟的问题,但我已经尝试自己解决了一段时间,给了它一些搜索(使用“地图”功能等),但我没有找到解决方案.也许这是某个地方的一个小错误,但我是 python 新手,似乎有某种隧道视野。

我有一些中间有数字的文本(见示例)。我想用正则表达式将所有数字提取到一个列表中,然后对它们求和。我似乎能够进行提取,但很难将它们转换为整数然后对它们求和。

import re
df = ["test 4497 test 6702 test 8454 test",
 "7449 test"]

numlist = list()
for line in df:
    line = line.rstrip()
    numbers = re.findall("[0-9]+", line) # find numbers
    if len(numbers) < 1: continue # ignore lines with no numbers, none in this sample
    numlist.append(numbers) # create list of numbers

sum(numlist) 返回错误。

【问题讨论】:

    标签: python list sum integer


    【解决方案1】:

    您不需要正则表达式。拆分列表中的字符串,sum 理解中的数字:

    sum(sum(int(i) for i in s.split() if i.isnumeric()) for s in df)
    # 27102
    

    或者类似地,将结果列表展平,然后sum 一次:

    from itertools imprt chain 
    sum(chain.from_iterable((int(i) for i in s.split() if i.isnumeric()) for s in df))
    # 27102
    

    【讨论】:

      【解决方案2】:

      这是您问题的根源:

      finadall 返回一个您要附加到numlist 的列表,一个列表。所以你最终得到一个列表列表。你应该这样做:

      numlist.extend(numbers)
      

      这样你最终会得到一个数字列表(嗯,实际上是数字的字符串表示形式)。然后您可以将字符串转换为整数并求和:

      the_sum = sum(int(n) for n in numlist)
      

      【讨论】:

      • 感谢您指出我的错误所在,这行得通!
      • 每个人都在尝试为您提供新的方法来找到答案,但我想我实际上会尝试告诉您您的问题是什么。如果您认为这是最好的,请随时接受此答案。
      • 我就是这么做的。谢谢!
      【解决方案3】:

      df 上迭代两次并将每个数字附加到numlist

      numlist = list()
      for item in df:
        for word in item.split():
          if word.isnumeric():
            numlist.append(int(word))
      
      print(numlist)
      print(sum(numlist))
      

      输出:

      [4497, 6702, 8454, 7449]
      27102
      

      您可以使用列表理解来制作单行:

      print(sum([int(word) for item in df for word in item.split() if word.isnumeric()]))
      >>> 27102
      

      【讨论】:

        【解决方案4】:

        就这么简单

        my_sum = sum(map(int, numbers_list))
        

        【讨论】:

        • OP 的输入是df = ["test 4497 test 6702 test 8454 test", "7449 test"],不是只有数字的列表
        • 对于给出的示例,这将返回错误:my_sum = sum(map(int, numlist)) Traceback(最近一次调用最后一次):文件“”,行1、在 my_sum = sum(map(int, numlist)) TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
        • 这是关于求和部分。 OP 说他做了提取。
        【解决方案5】:

        这是一个使用mapfiltersum 的选项:
        首先在空格处拆分字符串,过滤掉非数字,将数字字符串转换为 int,最后求和。

        # if you want the sum per string in the list
        sums = [sum(map(int, filter(str.isnumeric, s.split()))) for s in df]
        # [19653, 7449]
        
        # if you simply want the sum of all numbers of all strings
        sum(sum(map(int, filter(str.isnumeric, s.split()))) for s in df)
        # 27102
        

        【讨论】:

          最近更新 更多