简体   繁体   English

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

[英]Python Extracting numbers and adding them from a list

I have a list of strings: 我有一个字符串列表:

[' 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']`

So there are numbers in different formats: 因此,存在不同格式的数字:

86 .7 5. 0.0 86 .7 5. 0.0

Followed by strings of text. 后跟一串文字。

I need to add together all the numbers in this list. 我需要将此列表中的所有数字加在一起。

The adding part is obviously easy, but how do I get only the numbers out into a list of their own? 加法部分显然很容易,但是我如何只将数字放入自己的列表中呢?

>>> import re
>>> elements = [' 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', ' .7 miles', ' 5. miles']
>>> _re_digits = re.compile(r"(-?(?:(?:\d+(?:\.\d*)?)|(?:\.\d+)))")
>>> digits = []
>>> for element in elements:
    digits += [ float(n) for n in _re_digits.findall(element)]


>>> digits
[86.0, 43.0, 0.0, 43.0, 15.0, 0.0, 0.0, 0.0, 86.0, 0.7, 5.0]
>>> sum(digits)
278.7

We can join all strings in one, use a regular expression to extract all numbers, and then add them: 我们可以将所有字符串连接在一起,使用正则表达式提取所有数字,然后添加它们:

>>> 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

Assuming you want the numbers as floats: 假设您希望数字为浮点数:

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

You can transform your list to a list with numbers using regular expression: 您可以使用正则表达式将列表转换为带有数字的列表:

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]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM