【问题标题】:Findall() is not finding all the numbers in a text fileFindall() 没有找到文本文件中的所有数字
【发布时间】:2020-08-15 18:02:33
【问题描述】:

该代码应该找到总和为 445833 的 90 个数字。 我的代码找到 89 个数字,总和为 445829。我做错了什么?

fn=open('regex_sum_42.txt','r')

import re
numbers = []
count = 0

for line in fn:
    line = line.split()
    for char in line:
        n=re.findall('[0-9]+',char)
        if len(n)>0:
            count += 1
            for num in n:
                num = int(num)
            numbers.append(num)
print(sum(numbers))
print(count)

文本文件:http://py4e-data.dr-chuck.net/regex_sum_42.txt

【问题讨论】:

    标签: python numbers


    【解决方案1】:

    正如指出的那样,您有一些缩进错误,但整体方法可以简化一点。

    • 您不需要count,因为len(numbers) 会给您相同的答案。
    • 您可以在整行上使用re.findall(),而不仅仅是word
    • 您不需要条件,因为如果没有ns,for 将退出。

    例如:

    for line in fn:
        n = re.findall('[0-9]+', line)
        for num in n:
            num = int(num)
            numbers.append(num)
    print(sum(numbers))
    print(len(numbers))
    
    Out[]:
    445833
    90
    

    你也可以用list.extend()替换内部的for-loop,导致:

    In []:
    import re
    
    numbers = []
    
    with open('regex_sum_42.txt', 'r') as fn:
        for line in fn:
            numbers.extend(int(num) for num in re.findall('[0-9]+', line))
    
    print(sum(numbers))
    print(len(numbers))
    
    Out[]:
    445833
    90
    

    【讨论】:

    • 当然,如果您使用re.findall,您应该在整个文件中使用它,而不是一次只使用一行?这将简化代码并删除不必要的步骤。
    • @TheOtterlord 你可以这样做,但会增加内存使用量。
    • 是的,您可以在整个文件上使用它,但这意味着将整个文件加载到内存中,这可能是一个挑战。这一次迭代文件行。取决于约束。
    • 好点。尤其是在处理更大的文件时
    【解决方案2】:

    count += 1 放错地方了。

    将其移至for num in n: 的内部,使其计数每个 num。

    还将numbers.append(num) 移动到循环中。这可确保添加所有 num 值,而不是仅添加一行中的最后一个。

    fn=open('text.txt','r')
    
    import re
    numbers = []
    count = 0
    
    for line in fn:
        line = line.split()
        for char in line:
            n=re.findall('[0-9]+',char)
            if len(n)>0:
                for num in n:
                    count += 1
                    num = int(num)
                    numbers.append(num)
    print(sum(numbers))
    print(count)
    

    【讨论】:

      【解决方案3】:

      两件事:-

      1. 计数更新位置不对,直接下移到for循环中

      2. 总和是错误的,因为numbers.append(num) 的缩进不正确

      试试下面的代码

      fn = open('regex_sum_42.txt','r')
      
      import re
      numbers = []
      count = 0
      
      for line in fn:
          line = line.split()
          for char in line:
              n=re.findall('[0-9]+',char)
              if len(n)>0:
                  for num in n:
                      count += 1
                      num = int(num)
                      numbers.append(num)
      print(sum(numbers))
      print(count)
      

      【讨论】:

      • 1.计数不应从 1 开始,因为尚未计算任何内容
      【解决方案4】:

      使用更简单的代码,可以避免出现这些错误的机会。

      此代码使用map 内置函数遍历re.findall 的所有结果并将它们转换为int,然后将它们全部附加到列表(numbers)。然后您可以打印numberssumlen

      with open('regex_sum_42.txt') as f:
        numbers = [*map(int, re.findall('\d+', f.read()))]
        print(sum(numbers), len(numbers))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多