【问题标题】:python: how can I read elements of 2d dynamic lists?python:如何读取二维动态列表的元素?
【发布时间】:2014-11-28 01:43:57
【问题描述】:

我有以下数据

['1', '4', '4', '244', '263', '704', '952']
['2', '4', '4', '215', '172', '305', '33']
['3', '4', '4', '344', '279', '377', '1945']
['4', '4', '4', '66', '79', '169', '150']
['5', '4', '3', '16', '22', '247']
['6', '4', '4', '17', '154', '93', '309']
['7', '3', '2', '233', '311']
['8', '3', '1', '15']
['9', '3', '2', '55', '102']
..... 

总共 200 行,由 4 个 50 行数据块组成。类似格式的数据块在文件内重复 4 次。如何索引这些数据,并在每个块内按 blcok 方式和按列/行方式处理每个元素?我是否需要正交化这些数据?

我被困在从 str 到 int 的步骤中。我尝试应用 numpy.array 或 map,但它们不起作用。

【问题讨论】:

    标签: python string list integer


    【解决方案1】:

    一旦你有了你的清单

    l = [['1', '4', '4', '244', '263', '704', '952'],
         ['2', '4', '4', '215', '172', '305', '33'],
         ['3', '4', '4', '344', '279', '377', '1945'],
         ['4', '4', '4', '66', '79', '169', '150'],
         ['5', '4', '3', '16', '22', '247'],
         ['6', '4', '4', '17', '154', '93', '309'],
         ['7', '3', '2', '233', '311'],
         ['8', '3', '1', '15'],
         ['9', '3', '2', '55', '102']]
    

    在列表理解中使用map

    intList = [map(int, sublist) for sublist in l]
    

    结果

    >>> intList
    [[1, 4, 4, 244, 263, 704, 952],
     [2, 4, 4, 215, 172, 305, 33],
     [3, 4, 4, 344, 279, 377, 1945],
     [4, 4, 4, 66, 79, 169, 150],
     [5, 4, 3, 16, 22, 247],
     [6, 4, 4, 17, 154, 93, 309],
     [7, 3, 2, 233, 311],
     [8, 3, 1, 15],
     [9, 3, 2, 55, 102]]
    

    【讨论】:

    • 哦,现在我看得很清楚了。我的错误是因为我的数据是嵌套列表列表结构,所以您使用子列表概念来映射数据。伟大的!现在我知道为什么我的 map() 不工作了。这些动态数据的索引是否与正交数据的索引相同?
    • 我不确定我是否理解您的问题,您所说的正交数据是什么意思?你能举个例子吗?
    • 现在,在我的数据中,列数是不同的。我的“正交化”是指制作完美的 m x n 矩阵形状,例如 [5 4 3 16 22 247 0 0]。我希望通过数据块、行和列来索引所有数据,并使用嵌套的 for 循环来处理每个元素。
    • 不,这不是必须的。即使列表的长度不同,上面的代码也应该可以工作。
    • 非常感谢,我可以再问一个问题吗?如何在结果数据中按列存储数据?
    【解决方案2】:

    关于“正交化”,可能这就是你要找的,

    >>> li = [[1, 4, 4, 244, 263, 704, 952], [2, 4, 4, 215, 172, 305, 33], [3, 4, 4, 344, 279, 377, 1945], [4, 4, 4, 66, 79, 169, 150], [5, 4, 3, 16, 22, 247], [6, 4, 4, 17, 154, 93, 309], [7, 3, 2, 233, 311], [8, 3, 1, 15], [9, 3, 2, 55, 102]]
    >>> def orthogonalize(li):
        max_col = max(len(x) for x in li) + 1
        for l in li:
            for i in range(max_col-len(l)):
                l.append(0)
    
    
    >>> orthogonalize(li)
    >>> li
    [[1, 4, 4, 244, 263, 704, 952, 0], [2, 4, 4, 215, 172, 305, 33, 0], [3, 4, 4, 344, 279, 377, 1945, 0], [4, 4, 4, 66, 79, 169, 150, 0], [5, 4, 3, 16, 22, 247, 0, 0], [6, 4, 4, 17, 154, 93, 309, 0], [7, 3, 2, 233, 311, 0, 0, 0], [8, 3, 1, 15, 0, 0, 0, 0], [9, 3, 2, 55, 102, 0, 0, 0]]
    >>> li[5]
    [6, 4, 4, 17, 154, 93, 309, 0]
    >>> li[6]
    [7, 3, 2, 233, 311, 0, 0, 0]
    >>> 
    

    根据您的附加要求进行编辑:

    由于我的理解有限,我不得不做出假设, 您的数据是 2d 的,但您想使用 block#、line# 和 column# 在 3d 中访问它,因为我无法在您的数据中找到块标识符。你已经处理了你的数据

    >>> def getData(data, block, line, column = None):
        """
         Index start from 0 for block, line and column
         getData(data, 0,1,1)
           => block# is 0 it will be processed as is
           => it will read value of line#1, column#1 
         getData(data, 1,1,1)
           => block# is 1 it will be convert to line number = 50*(block)+line
           => it will read value of line#51, column#1
    
    
        """
        if column is None:
            return data[50*(block)+line]
        else:    
            return data[50*(block)+line][column]
    
    >>> d = [[1, 4, 4, 244, 263, 704, 952, 0],
    [2, 4, 4, 215, 172, 305, 33, 0],
    [3, 4, 4, 344, 279, 377, 1945, 0],
    ............
    [51, 4, 4, 244, 263, 704, 952, 0],
    [52, 4, 4, 215, 172, 305, 33, 0],
    [53, 4, 4, 344, 279, 377, 1945, 0],
    [54, 4, 4, 66, 79, 169, 150, 0],
    [55, 4, 3, 16, 22, 247, 0, 0],
    [56, 4, 4, 17, 154, 93, 309, 0],
    [57, 3, 2, 233, 311, 0, 0, 0],
    [58, 3, 1, 15, 0, 0, 0, 0],
    [59, 3, 2, 55, 102, 0, 0, 0],
    [60, 4, 4, 304, 209, 307, 945, 0]]
    >>> getData(d, 0, 0)
    [1, 4, 4, 244, 263, 704, 952, 0]
    >>> getData(d, 0, 0, 3)
    244
    >>> getData(d, 1, 0)
    [51, 4, 4, 244, 263, 704, 952, 0]
    >>> getData(d, 1, 0, 4)
    263
    

    【讨论】:

    • 谢谢。这对我也有很大帮助。我觉得我真的需要养成使用def的习惯
    • 我有一个问题。不管“正交化”如何,如何将这些数据一一拆分?我尝试了拆分和剥离,但都失败了。我想一个一个地阅读每个元素。
    • @exsonic01,为什么要拆分它?您可以访问矩阵中的结果列表,例如:li[0][0] => 1, li[1][1] => 4。如果您需要特定值,我已经在read and store data 中为您提供了示例代码
    • 我希望对每个数据块、每个列和每一行的元素做一些事情。我习惯了 fortran 风格的索引,所以我一直在寻找分割行并按列和行做一些事情的方法。
    • 非常感谢您的帮助。我可以使用这些列表进行嵌套 for 和 if 循环吗?我不确定如何索引这些列表
    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2020-07-25
    • 2017-11-18
    相关资源
    最近更新 更多