在python中将数据列表转换为矩阵(查看内部)

在python中将数据列表转换为矩阵(查看内部),python,python-3.x,matrix,Python,Python 3.x,Matrix,我正在编写将列表列表转换为矩阵的代码。这个函数应该可以扩展到更大的列表,我的输入只是为了使问题更容易解决。我还是个初学者,所以我需要一点帮助=) -输入: 在示例输入中,list1是水果和颜色对的数据集: list1 = [[["apple", "red"], " 1 "],[["apple", "yellow"], " 1 "], [["apple", "green"], " 1 "]] list1 += [[["lemon", "red"], " 0 "], [["lemon", "yell

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

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

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 "]]
-期望输出:

['', 'apple', 'lemon', 'pear']
['red', ' 1 ', 0, 0]
['yellow', 0, ' 1 ', 0]
['green', 1, 0, ' 1 ']
-我的输出

['///', 'apple', 'lemon', 'pear']
['red', ' 1 ', 0, 0]
['yellow', 0, ' 1 ', 0]
['green', 0, 0, ' 0 ']
------我的尝试:-----


编写一个手动循环来搜索列表会使事情过于复杂。编写两个循环来搜索两个字符串列表,并尝试将它们混合在一起,同时还循环索引其他内容……难怪您会感到困惑

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

columns = {'apple': 1, 'lemon': 2, 'pear': 3}
rows = {'red': 1, 'yellow': 2, 'green': 3}
现在,如果您想知道要放入哪个矩阵元素,则没有循环,只有两个dict查找:

>>> (colname, rowname), value = [["apple", "red"], " 1 "]
>>> columns[colname]
1
>>> rows[rowname]
1
现在我们要做的就是从一个空矩阵开始:

matrix = [
    ['///', 'apple', 'lemon', 'pear'],
    ['red', 0, 0, 0],
    ['yellow', 0, 0, 0],
    ['green', 0, 0, 0]]
…在元素上循环:

for (colname, rowname), value in list1:
…查找列和行:

    col = columns[colname]
    row = rows[rowname]
…并存储以下号码:

    matrix[row][col] = value
就这些

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

    col = columns[colname.strip()]
    row = rows[rowname.strip()]

如果您事先不知道所有标签,并且需要通过编程方式查找它们,该怎么办

您只需在主列表之前对列表进行一次额外的遍历,即可拉出所有唯一的行和列名。例如:

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
现在,要构建矩阵,您需要从这两个dict构建它。如果您使用的是Python3.7,那么您可以依赖这样一个事实,即dict的顺序是正确的,但是不依赖它可能更清楚。让我们先构建一个空矩阵:

matrix = [[0 for _ in range(len(columns)+1)] 
          for _ in range(len(rows)+1)]
…然后填写标题:

matrix[0][0] = '///'
for rowname, row in rows.items():
    matrix[row][0] = rowname
for colname, column in columns.items():
    matrix[0][column] = colname

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

试试numpy,非常感谢!你是救命恩人!你知道有什么方法可以把我的列表转换成同样风格的字典吗?我实际上是在一个巨大的数据集上做这件事的,所以我不能手动做。@oryx更新了答案。
matrix[0][0] = '///'
for rowname, row in rows.items():
    matrix[row][0] = rowname
for colname, column in columns.items():
    matrix[0][column] = colname