如何在python中创建一个值为字典的矩阵

时间:2016-01-26 04:29:12

标签: python list dictionary matrix

要创建值为列表的矩阵,我通常会执行以下操作:

T = [[0]*(4) for x in range(4)]
print T

输出:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

我正在尝试创建一个值为词典的矩阵,我尝试相同的操作并遇到问题。

T = [{"first":None,"second":None} *(4) for x in range(4)]

TypeError: unsupported operand type(s) for *: 'dict' and 'int'

这样做的正确方法是什么?

意向:

在每个T [i] [j],我试图记录第一轮选手和第二轮选手(i,j)所选的值。

3 个答案:

答案 0 :(得分:1)

如果我理解你的话你应该写:

T = [[{"first":None,"second":None} for y in range(4)] for x in range(4)]
print T

`

[[{'second': None, 'first': None}, {'second': None, 'first': None},
{'second': None, 'first': None}, {'second': None, 'first': None}],
 [{'second': None, 'first': None}, {'second': None, 'first': None},
 {'second': None, 'first': None}, {'second': None, 'first': None}], 
[{'second': None, 'first': None}, {'second': None, 'first': None}, 
{'second': None, 'first': None}, {'second': None, 'first': None}], 
[{'second': None, 'first': None}, {'second': None, 'first': None},
 {'second': None, 'first': None}, {'second': None, 'first': None}]]`

您无法做到的理由:

T = [[{"first":None,"second":None}]*4 for x in range(4)]

与您无法做到的原因相同:

T = [[[1]]*4 for x in range(4)]

当您编写*时,您基本上会重复相同的对象次数。因此,如果您更新其中一个条目,则该行中的所有条目都将更新,因为它们都是相同的对象。

在以下情况下不会发生这种情况:     T = [[0]*4 for x in range(4)]

因为0是一个int,当您在任何地方分配新值时,它会完全替换它。您可以在其他一些SO答案中找到更好的解释。 123

不支持词典+*。如果这可以解决您的问题,那么您应该在发布问题之前进行更多研究。否则,请详细说明。

答案 1 :(得分:0)

如果你想要一个包含4个唯一键的字典,你需要有一个生成器来制作键:

编辑 - 从复制的代码中删除了*(4)

T = [{i:None for i in range(4)} for x in range(4)]

请注意,字典的键不一定是字符串,这使得键使用所以它与任何用于支持使用列表的版本的代码非常相似

答案 2 :(得分:0)

我觉得其他答案并没有给你你想要的东西,这就是如何破解事物以使它们按照你想要的方式行事。

由于 dict 类没有 imul 数字类型来处理乘法运算,我们可以简单地创建自己的类来为我们做这个。

a = { 'first': None , 'second': None }

class MultDict:
    def __mul__(self, other):
        lst = []
        for i in range(other):
            lst.append(a.copy())
        return lst

x = MultDict()

t = [ x * (4) for i in range(4)]

print(t)

t[0][0]['first']=2
print(t)

输出:

[[{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None}],
[{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None}],
[{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None}],
[{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None}]] 


[[{'first': 2, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None}],
[{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None}],
[{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None}],
[{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None},
{'first': None, 'second': None}]]