Найдите наименьшее число с плавающей запятой в файле и распечатайте строку

У меня есть такой файл данных:

1 13.4545
2 10.5578
3 12.5578
4 5.224

Я пытаюсь найти строку с наименьшим числом с плавающей запятой и распечатать или записать всю строку (включая целое число) в другой файл. так что я получаю это:

4 5.224

У меня есть это, но не работает:

with open(file) as f:
    small = map(float, line)
    mini = min(small)
    print mini

также пробовал использовать это:

with open(file) as f:
    mylist = [[line.strip(),next(f).strip()] for line in f]
    minimum = min(mylist, key = lambda x: float(x[1]))
    print minimum

person octain    schedule 16.03.2015    source источник


Ответы (4)


Используя ваш файл данных, мы можем перебрать каждую строку файла внутри min, поскольку min принимает итератор:

>>> with open(fn) as f:
...    print min(f)
... 
1 13.4545

Очевидно, что это использование значения ascii целого числа для определения min.

Python min выполняет ключевую функцию:

def kf(s):
    return float(s.split()[1])

with open(fn) as f:
    print min(f, key=kf)

Or:

>>> with open(fn) as f:
...    print min(f, key=lambda line: float(line.split()[1]))
... 
4 5.224

Преимущество (в обеих версиях) в том, что файл обрабатывается построчно — нет необходимости считывать весь файл в память.

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


Чтобы исправить ВАШУ версию, проблема заключается в вашем первом понимании списка. В вашей версии есть next(), что вы, вероятно, думали, что это следующий номер. Это не так: Это следующая строка:

>>> with open(fn) as f:
...      mylist = [[line.strip(),next(f).strip()] for line in f]
... 
>>> mylist
[['1 13.4545', '2 10.5578'], ['3 12.5578', '4 5.224']]

Первое понимание списка должно быть:

>>> with open(fn) as f:
...    mylist=[line.split() for line in f]
... 
>>> mylist
[['1', '13.4545'], ['2', '10.5578'], ['3', '12.5578'], ['4', '5.224']]

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

>>> minimum=min(mylist, key = lambda x: float(x[1]))
>>> minimum
['4', '5.224']
person dawg    schedule 16.03.2015
comment
Йо Дог! (Помните меня?). Почему бы не сделать это одной строкой? with open(fn) as f: print min(f, key=lambda s: float(s.split()[1])) Это было бы еще компактнее ;) ;) - person Bhargav Rao; 16.03.2015
comment
@BhargavRao Потому что python — это не perl, а stackoverflow — это не игра в гольф. Ответы должны быть читаемы - person Terry Jan Reedy; 17.03.2015
comment
@TerryJanReedy, лол, братан, ты не понял ультимативного слова комментария. ответы dawg всегда самого высокого качества и никогда не требуют изменений!! Я просто прокомментировал это, потому что это будет одна строка. В любом случае, спасибо, что сказали мне, что Perl — это плохо! Я бы дважды подумал, прежде чем даже подумать об изучении Perl. Еще раз спасибо, добрый день! - person Bhargav Rao; 17.03.2015
comment
спасибо, очень простые решения! Я использовал вашу 3-ю версию, отлично работает! - person octain; 18.03.2015

Вы были совсем рядом, это минимальное необходимое редактирование

with open(fl) as f:                             # don't use file as variable name
    line = [i.strip().split() for i in f]       # Get the lines as separate line no and value
    line = [(x[0],float(x[1])) for x in line]   # Convert the second value in the file to float
    m = min(line,key =  lambda x:x[1])          # find the minimum float value, that is the minimum second argument.
    print "{} {}".format(m[0],m[1])             # print it. Hip Hip Hurray \o/
person Bhargav Rao    schedule 16.03.2015
comment
@JohnY (По секрету) Я всегда так использую. Это потому, что ОП не будет чувствовать себя разочарованным из-за того, что он был совершенно неправ. На более легкой вене, Эй! Джонни, ОП написал с помощью open(file) как f: :) - person Bhargav Rao; 16.03.2015
comment
Не могли бы вы объяснить свой отрицательный голос? Я хотел бы узнать и улучшить свой ответ. Ваши ценные отзывы мне очень помогут. Пожалуйста, ответьте, в чем недостаток моего ответа. Большое спасибо. - person Bhargav Rao; 16.03.2015
comment
@octain Добро пожаловать, братан. Наслаждайтесь жизнью кодера! Всего наилучшего! :) - person Bhargav Rao; 18.03.2015

карта:

map(function, iterable, ...) Применяет функцию к каждому элементу iterable и возвращает список результатов. Ссылка

Демо:

>>> map(float , ["1.9", "2.0", "3"])
[1.9, 2.0, 3.0]

>>> map(float , "1.9")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: .
>>> 

  1. Чтение входного файла модулем csv, поскольку структура входного файла фиксирована.
  2. Установите для переменных small и small_row значение None.
  3. Читать файл построчно.
  4. Тип Приведение второго элемента из строки из строки в число с плавающей запятой.
  5. Проверьте, что небольшая переменная равна None или меньше второго элемента строки.
  6. Если да, присвойте маленькое значение и small_row соответственно.

Демо:

import csv

file1 = "1_d.txt"

small = None
small_row = None
with open(file1) as fp:
    root = csv.reader(fp, delimiter=' ')
    for row in root:
        item = float(row[1])
        if small==None or small>item:
            small = item
            small_row = row

print "small_row:", small_row

Выход:

$ python 3.py 
small_row: ['4', '5.224']
person Vivek Sable    schedule 16.03.2015

person    schedule
comment
Это не печатает строку с минимальным - person Terry Jan Reedy; 17.03.2015
comment
Он также не объясняет, как и почему это отличается от оригинала. - person Terry Jan Reedy; 17.03.2015