Python从列表中提取数字并添加它们

Python从列表中提取数字并添加它们,python,list,numbers,Python,List,Numbers,我有一个字符串列表: [' 86 miles\n', ' 43 miles\n', ' MV\n', ' 0.0 miles\n', ' 43 miles\n', ' 15.0 miles\n', ' 0.0 miles\n', ' 0.0 miles\n', ' 0.0 miles \n', ' 86 miles\n', '.7 miles', '5. miles']` 所以有不同格式的数字: 86.75.0.0 后面是文本字符串 我需要把清单上的所有数字加起来 添加部分显然很简单,但

我有一个字符串列表:

[' 86 miles\n', ' 43 miles\n', ' MV\n', ' 0.0 miles\n', ' 43 miles\n', '  15.0 miles\n', ' 0.0 miles\n', ' 0.0 miles\n', ' 0.0  miles  \n', ' 86 miles\n', '.7 miles', '5. miles']`
所以有不同格式的数字:

86
.7
5.
0.0

后面是文本字符串

我需要把清单上的所有数字加起来


添加部分显然很简单,但如何仅将数字输出到它们自己的列表中?

您可以使用正则表达式将列表转换为包含数字的列表:

import re
regex = re.compile("[-+]?[0-9]*\.?[0-9]+")

l = [' 86 miles\n', ' 43 miles\n', ' MV\n', ' 0.0 miles\n', ' 43 miles\n', ' 15.0 m iles\n', ' 0.0 miles\n', ' 0.0 miles\n', ' 0.0 miles \n', ' 86 miles\n']

numbers = [float(regex.findall(x)[0]) for x in l if regex.findall(x) != [] ]
>>> [86.0, 43.0, 0.0, 43.0, 15.0, 0.0, 0.0, 0.0, 86.0]

您可以使用正则表达式将列表转换为包含数字的列表:

import re
regex = re.compile("[-+]?[0-9]*\.?[0-9]+")

l = [' 86 miles\n', ' 43 miles\n', ' MV\n', ' 0.0 miles\n', ' 43 miles\n', ' 15.0 m iles\n', ' 0.0 miles\n', ' 0.0 miles\n', ' 0.0 miles \n', ' 86 miles\n']

numbers = [float(regex.findall(x)[0]) for x in l if regex.findall(x) != [] ]
>>> [86.0, 43.0, 0.0, 43.0, 15.0, 0.0, 0.0, 0.0, 86.0]

我们可以将所有字符串合并为一个字符串,使用正则表达式提取所有数字,然后添加它们:

>>> import re
>>> l = [
    ' 86 miles\n', ' 43 miles\n', '  MV\n', ' 0.0 miles\n',
    ' 43 miles\n', '  15.0 miles\n', ' 0.0 miles\n',
    ' 0.0 miles\n', ' 0.0  miles  \n', ' 86 miles\n'
]
>>> sum(map(float, re.findall(r"\d+(?:\.\d+)?", "".join(l))))
273.0

我们可以将所有字符串合并为一个字符串,使用正则表达式提取所有数字,然后添加它们:

>>> import re
>>> l = [
    ' 86 miles\n', ' 43 miles\n', '  MV\n', ' 0.0 miles\n',
    ' 43 miles\n', '  15.0 miles\n', ' 0.0 miles\n',
    ' 0.0 miles\n', ' 0.0  miles  \n', ' 86 miles\n'
]
>>> sum(map(float, re.findall(r"\d+(?:\.\d+)?", "".join(l))))
273.0

假设您希望数字作为浮点数:

miles = [' 86 miles\n', ' 43 miles\n', ' MV\n', ' 0.0 miles\n', ' 43 miles\n', '  15.0 miles\n', ' 0.0 miles\n', ' 0.0 miles\n', ' 0.0  miles  \n', ' 86 miles\n']

total = 0.0
for s in miles:
    for t in s.split():
        try:
            total += float(t)
        except ValueError:
            pass

假设您希望数字作为浮点数:

miles = [' 86 miles\n', ' 43 miles\n', ' MV\n', ' 0.0 miles\n', ' 43 miles\n', '  15.0 miles\n', ' 0.0 miles\n', ' 0.0 miles\n', ' 0.0  miles  \n', ' 86 miles\n']

total = 0.0
for s in miles:
    for t in s.split():
        try:
            total += float(t)
        except ValueError:
            pass

“如果s.isdigit(),则str.split()中s的int(s)”应将所有数字提取到列表中,然后可以添加list@thefragileomen除非它不会:)@thefragileomen不适用于floats“如果s.isdigit(),则str.split()中s的int(s)”值应该将所有数字提取到列表中,然后可以添加list@thefragileomen除了它不会:)@在所有的答案中,我认为这个对我来说是最好的。非常感谢DQuick QUOTE,有没有办法修改它,使它也能捕捉到
“.7英里”
?“现在,它捕捉到了7英里的距离。”MikeVaughan我更新了答案。正则表达式有点难看,但这是因为不匹配的括号。其思想是,您必须分离案例:要么是一些数字,可选地后跟一个点,可选地后跟一个数字,要么是一个点后跟一个数字。尝试将两者合并将导致匹配单点。“尝试将两者合并将导致匹配单点”是我尝试自己时遇到的问题。我只是对正则表达式不太在行。我可以做一些简单的事情,但这只是很多。哈哈。再次感谢DI将更新问题,以包括这些新的字符串项。对于任何一个偶然发现这一点的人来说,在所有的答案中,我认为这一个对我来说是最好的。非常感谢DQuick QUOTE,有没有办法修改它,使它也能捕捉到
“.7英里”
?“现在,它捕捉到了7英里的距离。”MikeVaughan我更新了答案。正则表达式有点难看,但这是因为不匹配的括号。其思想是,您必须分离案例:要么是一些数字,可选地后跟一个点,可选地后跟一个数字,要么是一个点后跟一个数字。尝试将两者合并将导致匹配单点。“尝试将两者合并将导致匹配单点”是我尝试自己时遇到的问题。我只是对正则表达式不太在行。我可以做一些简单的事情,但这只是很多。哈哈。再次感谢DI将更新问题,以包括这些新的字符串项。对于任何偶然发现这一点的人。