Поиск целых чисел в файле - PullRequest
0 голосов
/ 17 октября 2018

Мне нужно найти целые числа файла.Мне нужно получить среднее значение этих целых (я уже разобрался с этой частью).Я получаю сообщение об ошибке: «ошибка ввода []: невозможно неявно преобразовать объект int в str»

EDIT - код работает.Всем спасибо!ДиКаприо помог мне найти окончательное решение.

Я отредактировал свой окончательный код так:

   def average_ints():
        integers = []
        num_ints = 0
        avg = 0
        with open("file") as f:
            for line in f:
                for i in line.split(' '):
                     integers.append(int(i))
                    num_ints = num_ints + 1
        avg = (sum(integers))/((num_ints))
        return avg

Как мне найти целые числа в этом файле?

Ответы [ 8 ]

0 голосов
/ 17 октября 2018

Я предлагаю уменьшенную версию ответа Ди Каприо с несколькими модификациями, чтобы убедиться, что вы просто собираете целые числа и можете использовать эту функцию для нескольких файлов.

def average_ints(path):
    integers = []
    with open(path) as f:
        for line in f:
            for i in line:
                if i.isdigit(): # Checks if string i represents an integer
                    integers.append(int(i)) # Appends the string as an integer to your list
    return sum(integers) / len(integers) # Calculates the average of the list items

print(average_ints('associate.txt')) # Your specific use case
0 голосов
/ 17 октября 2018

Другое решение с try и кроме:

def average_ints():
    integers = 0
    num_ints = 0
    avg = 0
    with open("associate.txt") as f:
        for line in f:
            for s in line.split():
                try:
                    i = int(s)
                    integers = i + integers
                    num_ints = num_ints + 1
                except ValueError:
                    continue
    avg = integers/num_ints
    return avg
0 голосов
/ 17 октября 2018

Вы можете легко решить это с помощью модуля регулярных выражений.

import re

def avarage_ints():
    with open("associate.txt") as f:
        content = f.read()
    list_of_integer_strings = re.findall(r'\d+', content)
    list_of_integers = list(map(int, list_of_integer_strings))
    avg = sum(list_of_integers) / len(list_of_integers)
    return avg

Это регулярное выражение будет соответствовать любой строке, состоящей из десятичных чисел в содержимом файла, и findall вернет список, содержащий их.

Возможно, вы захотите избежать совпадения целых чисел в слове.Например, не считая «2» в «sample2».В этом случае вы можете изменить регулярное выражение с r'\d+' на r'\A\d+\s|\s\d+\s|\s\d+$'

0 голосов
/ 17 октября 2018

Или почему бы и нет, это простое решение:

def average_ints():
   with open("associate.txt") as f:
       integers=int(f.read())
       num_ints=len(str(integers))
   avg = integers/num_ints
   return avg

Просто конвертируйте в целые числа, не проходя через каждый символ

И если есть нечисловые значения:

def average_ints():
   num_ints=0
   integers=0
   with open("associate.txt") as f:
       for i in f.read():
           if i.isdigit():
               num_ints+=1
               integers+=int(i)
   avg = integers/num_ints
   return avg
0 голосов
/ 17 октября 2018

Вы пробовали использовать регулярные выражения?Это может работать немного проще для вас.

Прочитайте файл и используйте выражение, подобное этому, должно разобрать файл на целые числа.

[0-9]+

https://docs.python.org/3/howto/regex.html

Iнадеюсь, это поможет.

0 голосов
/ 17 октября 2018

используйте приведение int(x) для преобразования str в int.По умолчанию все читается из файла как стр.

def average_ints():
    integers = 0
    num_ints = 0
    avg = 0
    with open("associate.txt") as f:
        for line in f:
            for i in line:
                # if i in line: <- this should always be True
                integers += int(i)  # + integers <- += adds and stores
                num_ints = num_ints + 1
    avg = integers/num_ints
    return avg

РЕДАКТИРОВАТЬ:

Я просто подумал, что вы, вероятно, проблема с частью for i in line:.Линия должна быть разделена.попробуйте использовать for i in line.split(' '), если ваши целые числа разделены пробелом.

РЕДАКТИРОВАТЬ 2:

Если для каждой строки используется одно целое:

def average_ints():
    integers = 0
    num_ints = 0
    avg = 0
    with open("associate.txt") as f:
        for line in f:
            integers += int(line)
            num_ints = num_ints + 1
    avg = integers/num_ints
    return avg
0 голосов
/ 17 октября 2018

Вы, вероятно, не должны использовать «int» как переменную, поскольку она является встроенной, и если вы попытаетесь сослаться на нее позже, вы не сможете.

Так что, судя по всему, вы хотите взять всецелые числа в файле и в среднем их?Вот функция, которая сделает это:

def avg_ints(x): # Where x is a file
    total = 0
    count = 0
    lines = x.readlines()
    for line in lines:
        for character in line:
            try:
                character = int(character)
                count += 1
                total += character
            except ValueError:
                pass
    return total/count
f = open("associate.txt")
print(avg_ints(f))
0 голосов
/ 17 октября 2018

Проблема в том, что int в строках является строкой, и вам нужно сначала преобразовать ее в целое число.Вы можете сделать это, заменив int на int (int).

Это предполагает, что в файле есть только числа (символы, которые могут быть представлены как числа с плавающей запятой или целые числа).Если нет, вам нужно учитывать это.

Также не рекомендуется именовать переменную после встроенной функции, поэтому я бы изменил имя int на другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...