Pythonic способ создания списка списков с плавающей точкой из текстового файла - PullRequest
0 голосов
/ 18 июня 2019

Я читаю из csv_reader, строка за строкой, и пытаюсь преобразовать список строк с плавающей точкой в ​​одной строке. В настоящее время у меня есть:

list([float(i) for i in map(list, csv_reader)])

Это явно не работает. Как бы я достиг того, чего хочу? Я хочу, чтобы все это тоже было в одной строке.

Требуются ли мне две map функции? Может быть, две Pythonic for петли?

Функция, с которой я имею дело:

def csv_input(filename):

    print(f'Currently reading the annotations from {filename}')

    try:
        csv_input_file = open(filename, 'rt')
    except FileNotFoundError:
        program_help()
        print("[Error] Input File not found")

    csv_reader = csv.reader(csv_input_file, delimiter=',')
    unfiltered_annots = list(float(i) for i in map(list, csv_reader))
    csv_input_file.close()

    return unfiltered_annots

Мой CSV-файл выглядит так:

11, 11, 24, 24, 0.75
10, 11, 20, 20, 0.8
11, 9, 24, 24, 0.7
40, 42, 20, 20, 0.6

И ошибка, которую я получаю:

Traceback (most recent call last):
  File "maximal_supression.py", line 124, in test_google_doc_example
    unfiltered_annots = csv_input('example_input.csv')
  File "maximal_supression.py", line 34, in csv_input
    unfiltered_annots = list(float(i) for i in map(list, csv_reader))
  File "maximal_supression.py", line 34, in <genexpr>
    unfiltered_annots = list(float(i) for i in map(list, csv_reader))
TypeError: float() argument must be a string or a number, not 'list'

1 Ответ

1 голос
/ 18 июня 2019

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

unfiltered_annots = list([[float(i) for i in l] for l in map(list, csv_reader)])

В моем слегка преобразованном коде (для простоты):

import csv

csv_input_file = open('a.csv', 'rt')
csv_reader = csv.reader(csv_input_file, delimiter=',')
unfiltered_annots = list([[float(i) for i in l] for l in map(list, csv_reader)])
csv_input_file.close()
unfiltered_annots

Возвращает список списков:

[[11.0, 11.0, 24.0, 24.0, 0.75],
 [10.0, 11.0, 20.0, 20.0, 0.8],
 [11.0, 9.0, 24.0, 24.0, 0.7],
 [40.0, 42.0, 20.0, 20.0, 0.6]]

P.S. Как упоминалось @ meowgoesthedog , csv_reader возвращает списки, поэтому вам не нужно отображать список в csv_reader:

unfiltered_annots = [list(map(float, l)) for l in csv_reader]

...