2015-06-05 52 views
0

我已经决定学习Python。我在C++中有一个背景,所以有一些挑战让我的大脑围绕着Python进行包装。我的问题是:Python等价于C++邻接表

我在C++中有以下语法,我正在寻找Python中的等价物。这只是一小段代码。我不确定我是否应该使用列表或Dicts。

int main() 
{ 
    ...some code... 

    int** matrix = 0; 
    buildmatrix(vertices,matrix); 

    ...some more code... 
    return EXIT_SUCCESS; 
} 

void buildmatrix(int& vertices,int** &matrix) 
{ 
    cout <<"Enter # of vertices -> "; 
    cin >>vertices; 

    matrix = new int* [vertices];  
    for(int i=0; i<vertices; i++)  
    { 
     matrix[i] = new int[vertices];  
    } 
    ...some more code... 
} 

简而言之,这将构建一个数组指针数组。使它看起来像一个矩阵。将此代码转换为Python时使用的最佳数据结构和方法是什么?

+0

因此,Python中的列表可以做指针数组(即动态二维数组)的指针? –

+0

是的,你可以很容易地得到一个列表清单,这是与你的C++代码最相似的。 –

回答

0

Python的翻译是:

def buildmatrix(): 
    vertices = int(raw_input("Enter # of vertices -> ") 

    matrix = []  
    for i in range(vertices): 
     matrix.append([]) 
    # alternatively, matrix = [[] for _ in range(vertices)] 

    return vertices, matrix 

def add_edge(matrix, vertex1, vertex2): 
    matrix[vertex1].append(vertex2) 
    matrix[vertex2].append(vertex1) 

这工作,因为有什么列表的元素可以是没有任何限制。在这里,每个元素是另一个列表,可以有任意长度。您可以随时更改列表的长度,我们在这里使用.append(),因此您不需要预先分配邻接列表中的空间。

+0

因此在插入边之后显示矩阵。我可以通过以下参考矩阵:print matrix [i] [j]? –

+0

为什么不试试呢,斯科特? –

0

其他语言可能会调用关联数组或hashmaps。列表是任意长度的容器。如果您需要与数组等效,请使用列表。

你应该做一个介绍性的Python教程;列表和数组之间的区别是非常重要的,并且会在那里解释。

+0

因此Python中的列表可以做指针数组(即动态二维数组)的指针? –

+0

用Python中的指针来思考可能是一个错误;我们有参考。但是,列表可以包含任何种类的对象,包括另一个列表。 –

+0

因此,列表清单听起来像是解决问题的方法,但不一定是唯一的方法。 –

0

C++中的容器仅限于一种类型的对象。 A std::vector<SomeType>只能包含SomeType类型的元素。 A std::list<SomeOtherType>只能包含SomeOtherType类型的元素。 A std::map<KeyType,ValueType>只能将KeyType类型的密钥映射到ValueType类型的值。等等。

在python中不是这样。 mixed_up_list = ["a", 1, [2, 3, 4]]没有问题。 Python中的列表可以包含数字,字符串,元组,列表,字典,对象,简而言之,任何东西。你如何在python中使用列表取决于你。请注意我的mixed_up_list中的最后一个元素。这是一个python列表。您的邻接列表可以很容易地用python列表表示,并且不需要用C++来担心所有的分配/释放。你的代码的