gpt4 book ai didi

python - 将数据列表的列表转换为 python 中的矩阵(检查内部)

转载 作者:太空宇宙 更新时间:2023-11-04 04:36:41 25 4
gpt4 key购买 nike

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

-输入:在示例输入中,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 ']

------我的尝试:------

# 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

最佳答案

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

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

columns = {'apple': 1, 'lemon': 2, 'pear': 3}
rows = {'red': 1, 'yellow': 2, 'green': 3}

现在,如果您想知道将某些内容放入哪个矩阵元素,则没有循环,只需两次字典查找:

>>> (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'。如果那是数据中的错误,您可以修复它。如果您的代码应该处理它,您必须决定如何处理它。一个明显的选择是从字符串中去除任何多余的空格:

    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

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

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

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

关于python - 将数据列表的列表转换为 python 中的矩阵(检查内部),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51528587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com