Использование понимания списка для удаления нежелательных строк и столбцов и преобразования всех строковых элементов в целочисленный тип - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть набор данных оценок учеников в формате CSV следующим образом:

data = '''student,maths,science,english,nepali,computer
John,57,77,73,50,55
Mark,52,66,89,78,50
Ben,57,85,53,87,53
Toby,90,63,64,76,58
Anna,52,97,88,81,51'''

Я хочу преобразовать его во вложенный list, используя следующий процесс:

  1. Удалите первую строку, а также имена учеников, которые являются первыми элементами каждой последующей строки
  2. Преобразование всех оставшихся элементов, представляющих знаки, в целые числа

Я хотел бы сделать это с list пониманием.

Желаемый вывод:

[[57, 77, 73, 50, 55],
 [52, 66, 89, 78, 50],
 [57, 85, 53, 87, 53],
 [90, 63, 64, 76, 58],
 [52, 97, 88, 81, 51]]

Я пробовал следующий код ( работает , но без использованияпонимание списка):

 def read_data(file_name):
'''function to read data from a file, process it and store 
it in a data matrix (2D list)
returns the data matrix'''

file = open(file_name,"r")
data = file.readlines()
file.close()

mat = []
for line in data:
    mat.append(line.replace("\n","").split(","))

for i in range(1,len(mat)):
    for j in range(1,len(mat[i])):
        mat[i][j] = int(mat[i][j])
return mat

Ответы [ 5 ]

3 голосов
/ 22 апреля 2019

Здесь мы идем

data = """student,maths,science,english,nepali,computer
John,57,77,73,50,55
Mark,52,66,89,78,50
Ben,57,85,53,87,53
Toby,90,63,64,76,58
Anna,52,97,88,81,51"""

output = [[int(item) for item in line]
          for row in data.split("\n")[1:]
          for line in [row.split(",")[1:]]]

print(output)

Что дает

[
    [57, 77, 73, 50, 55],
    [52, 66, 89, 78, 50],
    [57, 85, 53, 87, 53],
    [90, 63, 64, 76, 58],
    [52, 97, 88, 81, 51]
]

При этом используется срез списка ([1:]), а имена переменных не требуют пояснений.


Подсказка: для возможных будущих вопросов всегда лучше предоставить текст, который затем можно будет скопировать и вставить - здесь вы получите помощь быстрее.
3 голосов
/ 22 апреля 2019

В общем случае, когда у вас есть цикл for следующей формы:

result = []
for object in iterable:
    result.append(function(object))

Вы можете преобразовать его в list следующим образом:

result = [function(object) for object in iterable]

Соответственно,здесь мы можем иметь следующее:

mat = [line.replace('\n', '').split(',') for line in data]

Однако обратите внимание, что у нас есть вызов split для каждого значения line, что означает, что у нас есть вложенный list, и мы хотим преобразоватькаждый элемент внутренний list в целое число.Для вложенного list нам нужно вложенное понимание list.Возвращаясь к приведенному выше шаблону, ясно, что функция int:

mat = [[int(element) for element in line.replace('\n', '').split(',)] for line in data]

К сожалению, это все еще не будет работать, потому что первая строка data - это заголовки, а первый элемент каждой строки - это имена учеников .Поэтому нам нужно разделить наши данные на заголовки, имена и отметки:

with open(file_name) as f:
    data = f.read().split('\n')

processed_data = [line.replace('\n', '').split(',') for line in data]

headings = processed_data[0]
names = [line[0] for line in processed_data[1:]]
marks = [[int(element) for element in line[1:]] for line in processed_data[1:]]
2 голосов
/ 22 апреля 2019

Здесь вы можете использовать модуль csv.

Пример:

import csv

def read_data(file_name):
    with open(file_name) as infile:
        reader = csv.reader(infile)
        next(reader)                   #Skip header
        result = [list(map(int,row[1:])) for row in reader]    #list comprehension
    return result
1 голос
/ 22 апреля 2019
with open("your_file.txt") as f:
    c = f.readlines()

o = [x.replace("\n","").split(",")[1:] for x in c[1:]]

Эта строка интересует вас,

[x.replace("\n","").split(",")[1:] for x in c[1:]]

Для каждой строки x в файле замените "\ n" и разделите их на список на ",". После разделения вы можете игнорировать первый индекс [0], который будет именем, которое вы хотите удалить.

1 голос
/ 22 апреля 2019

Попробуйте вместо второго цикла:

mat = [list(map(int,i)) for i in mat] 
...