对字符串列表中的所有数字求和
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
这是一个使用 map
、filter
和 sum
的选项:
首先在空格处拆分字符串,过滤掉 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
抱歉,如果这是一个非常菜鸟的问题,但我已经尝试自己解决了一段时间,进行了一些搜索(使用“地图”功能等)但我没有找到解决方案对此。也许这是某个地方的小错误,但我是 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
这是一个使用 map
、filter
和 sum
的选项:
首先在空格处拆分字符串,过滤掉 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