MATLAB与Python中的dict列表的等价物是什么?

MATLAB与Python中的dict列表的等价物是什么?,python,matlab,append,Python,Matlab,Append,在Python中: my_list = [] my_dict_a = {1: 'one'} my_dict_b = {2: 'two'} my_dict_c = {3: 'three'} my_list.append(my_dict_a) my_list.append(my_dict_b) my_list.append(my_dict_c) 其中my_list现在将等于[{1:'1'},{2:'2'},{3:'3'}] 如果我们可以说containers.Map是python dict的基本等

在Python中:

my_list = []
my_dict_a = {1: 'one'}
my_dict_b = {2: 'two'}
my_dict_c = {3: 'three'}
my_list.append(my_dict_a)
my_list.append(my_dict_b)
my_list.append(my_dict_c)
其中
my_list
现在将等于
[{1:'1'},{2:'2'},{3:'3'}]

如果我们可以说containers.Map是python dict的基本等价物,那么MATLAB与上面的python append的等价物是什么

我在MATLAB中尝试的内容:

知道:

>a=[];
>b=1;    
>a = [a, b]

a =  1

>a = [a, b]

a = 1     1

>a = [a, b]

a = 1     1     1

然而,当我尝试对
containers.Map
对象执行相同操作时:

>dictA=containers.Map();
>dictA('first')=1;
>dictA('second')=2;
>dictA('third')=3;

>a=[];
>a = [a, dictA]

a = 

  Map with properties:

        Count: 3
      KeyType: char
    ValueType: any

>a = [a, dictA]
Error using containers.Map/horzcat
Horizontal concatenation is not supported by a containers.Map.
嗯。但是关于:

>a=[];
>a = [a; dictA]

a = 

  Map with properties:

        Count: 3
      KeyType: char
    ValueType: any

>a = [a; dictA]

a = 

  Map with properties:

        Count: 3
      KeyType: char
    ValueType: any

>whos a
  Name      Size            Bytes  Class             Attributes

  a         3x1               112  containers.Map
但它并没有继续附加:

>a={};
>a = [a; dictA]

a = 

  Map with properties:

        Count: 3
      KeyType: char
    ValueType: any

>a = [a; dictA]

a = 

  Map with properties:

        Count: 3
      KeyType: char
    ValueType: any

>whos a
  Name      Size            Bytes  Class             Attributes

  a         3x1               112  containers.Map     
然而

>{dictA}

ans = 

    [3x1 containers.Map]


>a = {};
>a = [{a}; {dictA}]

a = 

    {}
    [3x1 containers.Map]

>a = [{a}; {dictA}]

a = 

    {2x1 cell          }
    [3x1 containers.Map]

>whos a
  Name      Size            Bytes  Class    Attributes

  a         2x1               672  cell               

>a = [{a}; {dictA}]

a = 

    {2x1 cell          }
    [3x1 containers.Map]

>whos a
  Name      Size            Bytes  Class    Attributes

  a         2x1              1008  cell       

>a = {};
>a = {a dictA}

a = 

    {}    [3x1 containers.Map]

>whos a
  Name      Size            Bytes  Class    Attributes

  a         1x2               336  cell               

a = {a dictA}

a = 

    {1x2 cell}    [3x1 containers.Map]

>whos a
  Name      Size            Bytes  Class    Attributes

  a         1x2               672  cell 
最后

>a = {};
>a = {[a] [dictA]}

a = 

    {}    [3x1 containers.Map]

>a = {[a] [dictA]}

a = 

    {1x2 cell}    [3x1 containers.Map]

>a = {[a] [dictA]}

a = 

    {1x2 cell}    [3x1 containers.Map]

可能的等效物是包含以下结构的单元:

octave:52> d1.val='one';d2.val='two';d3.val='three';
octave:53> c={d1,d2,d3};
octave:54> c
c = 
{
  [1,1] =
    scalar structure containing the fields:
      val = one
  [1,2] =
    scalar structure containing the fields:
      val = two
  [1,3] =
    scalar structure containing the fields:
      val = three
}
octave:55> c{2}.val
ans = two
单元格具有列表的内容灵活性。结构就像一本字典,尽管对键有更多的限制。或者你可以把它们比作Python对象。事实上,MATLAB中最初的“对象”实现是建立在结构之上的(20世纪90年代末)

另一种可能是结构数组。从倍频程文档:

 x(1).a = "string1";
 x(2).a = "string2";
 x(1).b = 1;
 x(2).b = 2;

octave:65> x
x =
  1x2 struct array containing the fields:
    a
    b
octave:66> x(1)
ans =
  scalar structure containing the fields:
    a = string1
    b =  1
有时,使用
scipy.io.loadmat/savemat
在MATLAB和
numpy
之间来回写入对象会有所帮助。这些开发人员已经计算出一组等价物


比较结构和容器的其他SO问题:

MATLAB文档表示,容器对于保存小值(标量(?)和字符串)最为有效。我还没见过关于在牢房里收集容器的讨论


如果您对numpy/MATLAB数据交换集合感兴趣,那么它仍然可能是一个问题,这取决于它如何将它们保存到.mat文件。

containers.Map类不支持与数字数组相同的数组连接(部分原因是
Map
类重载了一些数组访问函数),因此无法创建
Map
对象数组(尽管尝试垂直连接时没有错误消息)

容器的单元格数组。映射对象 但是,您可以创建一个包含
Map
对象的单元格数组;您只需要注意语法。您已经非常接近了,但我认为这正是您想要的:

>> a = {};
>> a = [a, {dictA}]
a = 
    [3x1 containers.Map]

>> a = [a, {dictA}]
a = 
    [3x1 containers.Map]    [3x1 containers.Map]

>> a = [a, {dictA}]
a = 
    [3x1 containers.Map]    [3x1 containers.Map]    [3x1 containers.Map]

>> a{1}('first')
ans =
     1
我们本可以用分号来代替垂直连接它们
a=[a;{dictA}]

单元格数组、
{}
[]
我的想法是,
{}
用于将内容放入单元格(并将其取出),而
[]
是级联操作,也适用于单元格数组

a={}
a
指定为空单元格数组

a=[a,{dictA}]
dictA
放入一个单元格,然后将这个1x1单元格数组与单元格数组
a
连接起来

a=[{a},{dictA}]
会将
a
放在另一个单元格数组中,从而导致遇到奇怪的嵌套单元格数组

a{1}
返回单元格数组
a
中第一个单元格的内容,在本例中,该单元格是
Map
对象

在我看来,学习MATLAB时,单元格数组和各种括号/括号的使用是最令人困惑的事情之一

小心!这些是肤浅的复制品 请注意,这就是MATLAB所称的“句柄类”,这意味着
a{1}
a{2}
dictA
都是指向同一对象的指针/引用。因此:

>> a{1}('fourth') = 4;
>> a
a = 
    [4x1 containers.Map]    [4x1 containers.Map]    [4x1 containers.Map]

请注意,所有这三个都增加了大小。我只是想警告您,如果这与Python中的行为不同(我不知道Python中的行为是什么).

,可能吧。@excaza谢谢。不过,我想问一下
容器.Map
,它似乎与python dict类似,我想知道如何创建一个列表,例如
映射容器的
单元格数组
。除非一个结构实际上与python dict更为相似?谢谢。可以这样做吗作为
映射容器的
单元数组
,或者你会建议不要这样做吗?仔细研究一下,我发现
映射容器
从2008年就已经存在,并且基于
Java
哈希映射
。它们确实更接近Python字典。最近的一个MATLAB问题将它们与结构进行了比较,谢谢。这些链接很有帮助。
>> a = {};
>> a = [a, {dictA}]
a = 
    [3x1 containers.Map]

>> a = [a, {dictA}]
a = 
    [3x1 containers.Map]    [3x1 containers.Map]

>> a = [a, {dictA}]
a = 
    [3x1 containers.Map]    [3x1 containers.Map]    [3x1 containers.Map]

>> a{1}('first')
ans =
     1
>> a{1}('fourth') = 4;
>> a
a = 
    [4x1 containers.Map]    [4x1 containers.Map]    [4x1 containers.Map]