Используя ваш файл данных, мы можем перебрать каждую строку файла внутри 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