Python Minimum пуст

f = open("data.txt", "r")
lines = f.read().split('\n')
a= max(lines)
print a
f.close()

Приведенный выше код получает максимум из моего файла данных, но когда я пытаюсь:

f = open("data.txt", "r")
lines = f.read().split('\n')
a= min(lines)
print a
f.close()

Я получаю пустое возвращение, как минимум в файле пустое место. Почему это? Как я могу получить минимальное чтение?

Файл выглядит так

1
2
3
4
5

4 ответа

Решение

Это потому, что у вас есть пустая строка в вашем файле. Чтобы отбросить эти значения, используйте выражение генератора или понимание списка

f = open("data.txt", "r")
lines = f.readlines()
if lines:
    a = min(int(line) for line in lines if line.strip())
    print a
f.close()

Ошибка, как указано выше, из-за \n... Вы можете попробовать это

with open("file.txt") as f: 
    print(min(int(i) for i in f if i.strip()))

Это генератор exp в сочетании с функцией cal ... Хотя и сложнее, он меньше по размеру

Я предлагаю вам изменить свой код, как показано ниже.

f = open("file", "r")
print(min((i for i in f.read().split('\n') if i), key=float))
f.close()

Исполнение:

$ cat file
0.5
1
2
3
4
5
10.1
10.2
$ python3 file.py
0.5

Первое предположение может заключаться в том, что ваш файл на самом деле имеет пустую / пустую строку в конце, что приведет к тому, что "минимум" будет пустым.

Однако, даже с файлом без постороннего символа новой строки, у вас все равно будет проблема.

Если вы разделите поток AA\nBB\nCC\n (обычный файл) с символом новой строки в качестве разделителя, последний символ новой строки даст вам пустой элемент, так же, как разделение AA,BB,CC, на запятой бы:

['AA','BB','CC','']

Другими словами, после последнего разделителя есть пустое поле.

Есть несколько способов исправить это, например:

lines = f.read().split('\n')[:-1]

или, альтернативно:

a = min(lines[:-1])

если вы знаете, что будет заключительный символ новой строки (который обычно должен быть для обычных текстовых файлов).

Если вы хотите обработать случаи, когда файл может не обязательно заканчиваться переводом строки и также может быть пустым, вы можете использовать это вместо:

lines = f.read().split('\n')
if len(lines) == 0:
    minline = "" # or None if you prefer
else:
    if lines[-1] == '':
        lines = lines[:-1]
    minline = min(lines)
# Use minline here

И, как последнее замечание, min/max дать вам лексикографическую сортировку, которая будет сортировать числа от 1 до 10 включительно как:

1,10.2.3.4.5.6.7.8.9

Если вам нужна числовая сортировка (и вы знаете, что все строки имеют допустимые числа), используйте:

min(mylist,key=int)
Другие вопросы по тегам