首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将数据列表转换为python中的矩阵(查看内幕)

将数据列表转换为python中的矩阵(查看内幕)
EN

Stack Overflow用户
提问于 2018-07-26 06:34:40
回答 1查看 181关注 0票数 2

我正在编写将列表列表转换为矩阵的代码。这个函数应该可以扩展到更大的列表,我的输入只是为了让问题更容易处理。我还是个初学者,所以我需要一点帮助=)

-input:在示例输入中,list1是水果和颜色对的数据集:

代码语言:javascript
复制
list1 = [[["apple", "red"], " 1 "],[["apple", "yellow"], " 1 "], [["apple", "green"], " 1 "]]
list1 += [[["lemon", "red"], " 0 "], [["lemon", "yellow"], " 1 "], [["lemon", "green"], " 0 "]]
list1 += [[["pear ", "red"], " 0 "], [["pear", "yellow"], " 0 "], [["pear", "green"], " 1 "]]

-Desired输出:

代码语言:javascript
复制
['', 'apple', 'lemon', 'pear']
['red', ' 1 ', 0, 0]
['yellow', 0, ' 1 ', 0]
['green', 1, 0, ' 1 ']

-My输出

代码语言:javascript
复制
['///', 'apple', 'lemon', 'pear']
['red', ' 1 ', 0, 0]
['yellow', 0, ' 1 ', 0]
['green', 0, 0, ' 0 ']

-我的尝试:

代码语言:javascript
复制
# create empty matrix
matrix=[]
for row in range(4):
    new_row =[]
    for col in  range(4):
        new_row.append(0)   #if starting    all-0
    matrix.append(new_row)

    # add object names
    names = ["///", "apple", "lemon", "pear"]
    color = ["///", "red", "yellow", "green"]
    color = color[::-1]
    matrix[0] = names
    for row in matrix:
        row[0] = color.pop()

    second_obj = 0
    for row in range(4):
        for col in range(4):
            if list[row][0][0] == matrix[0][col]:
                while list[row][0][1] != matrix[second_obj][0]:
                    second_obj += 1
                else:
                    if matrix[row][row] != "///":
                        matrix[row][row] = list[row][1] 
                    second_obj = 0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-26 07:11:29

编写一个手动循环来搜索列表是过于复杂的事情。编写两个循环来搜索两个字符串列表,并尝试将它们混合在一起,同时循环索引其他…难怪你把自己搞糊涂了。

让我们放弃它,转而使用一些字典:

代码语言:javascript
复制
columns = {'apple': 1, 'lemon': 2, 'pear': 3}
rows = {'red': 1, 'yellow': 2, 'green': 3}

现在,如果你想知道放入哪个矩阵元素,没有循环,只需要两次字典查找:

代码语言:javascript
复制
>>> (colname, rowname), value = [["apple", "red"], " 1 "]
>>> columns[colname]
1
>>> rows[rowname]
1

所以,现在我们要做的就是从一个空矩阵开始:

代码语言:javascript
复制
matrix = [
    ['///', 'apple', 'lemon', 'pear'],
    ['red', 0, 0, 0],
    ['yellow', 0, 0, 0],
    ['green', 0, 0, 0]]

…循环遍历元素:

代码语言:javascript
复制
for (colname, rowname), value in list1:

…查找列和行:

代码语言:javascript
复制
    col = columns[colname]
    row = rows[rowname]

…并存储号码:

代码语言:javascript
复制
    matrix[row][col] = value

非那样做不行。

嗯,差不多吧。您的数据有问题,其中一个字符串是'pear ',而不是'pear‘。如果这是数据中的错误,您可以直接修复它。如果你的代码应该处理它,你必须决定如何处理它。一个明显的选择是从字符串中去掉所有多余的空格:

代码语言:javascript
复制
    col = columns[colname.strip()]
    row = rows[rowname.strip()]

如果你事先不知道所有的标签,并且需要通过编程找到它们,该怎么办呢?

您只需在主要列表之前对列表进行额外的传递,取出所有唯一的行名和列名。例如:

代码语言:javascript
复制
rows, columns = {}, {}
for (colname, rowname), value in list1:
    if rowname not in rows:
        next_unused_index = len(rows) + 1
        rows[rowname] = next_unused_index
    if colname not in columns:
        next_unused_index = len(columns) + 1
        columns[colname] = next_unused_index

现在,要构建矩阵,您需要从这两个字典构建它。如果你使用的是Python 3.7,你可以相信字典的顺序是正确的,但更清楚的是不要依赖于这一点。让我们先构建一个空矩阵:

代码语言:javascript
复制
matrix = [[0 for _ in range(len(columns)+1)] 
          for _ in range(len(rows)+1)]

…然后填写标题:

代码语言:javascript
复制
matrix[0][0] = '///'
for rowname, row in rows.items():
    matrix[row][0] = rowname
for colname, column in columns.items():
    matrix[0][column] = colname

…然后,您可以运行与前面相同的代码来填充值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51528587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档