代码之家  ›  专栏  ›  技术社区  ›  Sarun Dahal

使用列表理解删除不需要的行和列,并将所有字符串项转换为整数类型

  •  -1
  • Sarun Dahal  · 技术社区  · 5 年前

    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. 将表示标记的所有剩余元素转换为整数

    我想用一个 列表

    期望输出:

    [[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
    
    4 回复  |  直到 5 年前
        1
  •  3
  •   gmds    5 年前

    通常,当您有以下形式的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 ,这意味着我们有一个嵌套的 列表 ,我们要转换 内部的 列表 一个整数。对于嵌套 列表 ,我们需要一个嵌套的 列表 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
  •  3
  •   Jan    5 年前

    我们开始吧

    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
  •  2
  •   Rakesh    5 年前

    你可以用 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
    
        4
  •  1
  •   Mehrdad Pedramfar    5 年前

    试试这个,而不是你的第二个循环:

    mat = [list(map(int,i)) for i in mat] 
    
        5
  •  1
  •   void    5 年前
    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”,并用“,”将它们拆分为列表。