Разбор нескольких типов переменных из строки в Python

1

У меня есть входной файл с годами и рейтингами, который выглядит так:

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)]
  • 0
    этот файл хранится в фрейме данных?
  • 0
    @RahulAgarwal Нет, просто .txt файлы на диске. Контекст - обработка данных сокращения карты в hadoop.
Теги:
python-3.x

3 ответа

1

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

for line in sys.stdin:
    year, rating = (lambda x: (int(x[0]), float(x[1])))(line.split())

но IMHO сложнее читать, чем ваше 2-строчное решение, поэтому не уверен, что это больше pythonic...

Возможно, модуль csv можно использовать, если данные являются разделителями табуляции или пробела...

0

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

Пока вы не уверены, что каждая строка имеет следующий шаблон: 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.

0

Попробуйте функцию 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)]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню