对字符串列表中的所有数字求和

Sum all numbers in a list of strings

抱歉,如果这是一个非常菜鸟的问题,但我已经尝试自己解决了一段时间,进行了一些搜索(使用“地图”功能等)但我没有找到解决方案对此。也许这是某个地方的小错误,但我是 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) returns 错误。

您不需要为此使用正则表达式。拆分列表中的字符串,以及 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

就像

一样简单
my_sum = sum(map(int, numbers_list))

这是您问题的根源:

finadall returns 您要附加到 numlist 的列表,一个列表。所以你最终得到了一个列表列表。你应该改为:

numlist.extend(numbers)

所以你最终得到一个数字列表(好吧,实际上是数字的字符串表示)。然后你可以将字符串转换为整数并求和:

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

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

您可以使用列表推导式 one-liner:

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

这是一个使用 mapfiltersum 的选项:
首先在空格处拆分字符串,过滤掉 non-numbers,将 number-strings 转换为 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