У меня есть входной файл с годами и рейтингами, который выглядит так:
1997 4.2
2004 1.2
1908 3.6
...
Годы должны обрабатываться как целые числа, и рейтинги должны обрабатываться подобно поплавкам.
Мне интересно, есть ли в линиях один-рядный/более питонический способ чтения, чем то, что я сейчас делаю:
for line in sys.stdin:
year, rating = line.strip().split('\t')
year, rating = [int(year), float(rating)]
Вы можете написать его в одной строке, используя лямбда:
for line in sys.stdin:
year, rating = (lambda x: (int(x[0]), float(x[1])))(line.split())
но IMHO сложнее читать, чем ваше 2-строчное решение, поэтому не уверен, что это больше pythonic...
Возможно, модуль csv можно использовать, если данные являются разделителями табуляции или пробела...
Есть много способов, которыми вы можете это сделать, и другие ответы кажутся правильными, но я думаю, что есть более простой способ.
Пока вы не уверены, что каждая строка имеет следующий шаблон: int\tfloat
, вы можете использовать literal_eval
для преобразования встроенных типов в строку в родные типы python. Вот ваш простой код:
from ast import literal_eval
for line in sys.stdin:
year, rating = [literal_eval(x) for x in line.strip().split("\t")]
Этот код работает очень просто. Как вы использовали, если вы знаете, что line.strip().split("\t")
.
Мы присвоили year
и rating
переменных элементам [literal_eval(x) for...]
. Таким образом, первый и второй элементы этого списка будут назначены им. В литеральном списке мы разделим исходную строку и преобразуем каждый элемент сгенерированного списка в родные типы python, используя literal_eval
. Таким образом, после того, есть int
в year
и float
в rating
.
Попробуйте функцию map()
:
with open('data.txt', 'r') as f:
s = f.read()
l = list(map(lambda x: (int(x[0]),float(x[1])),[i.split('\t') for i in s.split('\n')]))
пример ввода:
1997 4.2
2004 1.2
1908 3.6
Пример вывода:
[(1997, 4.2), (2004, 1.2), (1908, 3.6)]