Python equivalent for C++ STL vector/list containers
Asked Answered
G

6

22

Is there something similar in Python that I would use for a container that's like a vector and a list?

Any links would be helpful too.

Gothurd answered 9/1, 2011 at 0:58 Comment(1)
For linked list: [a0,[a1,[a2,[a3,[...]]]]]Gerontocracy
A
13

You can use the inbuilt list - underlying implementation is similar to C++ vector. Although some things differ - for example, you can put objects of different type in one and the same list.

http://effbot.org/zone/python-list.htm

N.B.: Please keep in mind that vector and list are two very different data structures. List are heterogeneous, i.e. can store different object types, while C++ vectors are homogeneous. The data in vectors is stored in linear arrangement whereas in list is a collection of references to the type and the memory address of the variables.

Afterthought answered 9/1, 2011 at 1:0 Comment(6)
Is accessing linear in time O(1), similar to accessing a vector as an array in C++?Gothurd
Yes, underlying implementation is like a C++ vector.Afterthought
That arrays are called lists (which is genereally used as shortcut for linked list, which is a wholly different data structure) is one of the few really unfortunate things in Python.Seminarian
Thanks, it has the performance factors on the bottom, good info!Gothurd
This answer is incomplete for being accepted: the list class is nothing like std::list. (There's no builtin linked list implementation in Python.)Washbasin
Dead link. Could you provide another?Indopacific
N
12

Have a look at Python's datastructures page. Here's a rough translation:

  1. () => boost::Tuple (with one important distinction, you can't reassign values in a Python tuple)
  2. [] => std::vector (as the comments have aluded towards, lacks memory characteristics associated with vectors)
  3. [] => std::list
  4. {} => tr1::unordered_map or boost::unordered_map (essentially a hash table)
  5. set() => std::set
Needleful answered 9/1, 2011 at 1:3 Comment(7)
Well, it can be... it depends on the backing implementation. But in CPython, yes, [] != std::list.Much
@Amber: No Python implementation would ever dare to use linked lists for the builtin list type. That would totally screw about every piece of code that relies on indexing being O(1) (a totally valid assumption) - i.e. really much. We can safely ignore this scenario.Seminarian
@delnan There are, however, backing data structures which would be much closer to a std::list than the CPython implementation.Much
@Amber: Please elaborate. What data structure is "close to a linked list" but offers e.g. O(1) indexing and appending?Seminarian
@delnan Certain variants of b-trees don't offer O(1) indexing, but can get fairly close (close enough that all but the largest edge cases wouldn't have a noticeable difference).Much
@Amber: In reality it would be a big difference both in terms of performance and memory use, to the worse. So I don't see why anyone would want to differ from CPython in this case - after all, it's the de facto standard.Afterthought
set() => std::unordered_set , since it's hashsetHierarchize
H
7
py cpp
deque deque
PriorityQueue (or you may use heapq) priorityqueue
set unordered_set
list vector
defaultdict(int) unordered_map
list stack
deque queue
dict .get(val,0) unordered_map
array array
np.array valarray

valarray is poor man's np.array.

in py >= 3.7, dict remember insert order. https://mcmap.net/q/75657/-how-do-you-retrieve-items-from-a-dictionary-in-the-order-that-they-39-re-inserted


In case you need TreeMap / TreeSet

https://github.com/grantjenks/python-sortedcontainers

Hierarchize answered 7/5, 2021 at 19:0 Comment(0)
V
1

The cstl library wrapped commonly used C++ STL libraries including vector, unordered_map, and unordered_set for Python. It uses purely C++ implementation and does not have the copy-on-write issue that happens in all python objects. See https://github.com/fuzihaofzh/cstl for how to install and use.

Install it from pip

pip install cstl

Convert python objects into cstl objects:

import cstl

# Directly covert containers from python
v = cstl.frompy({"1":[1,2,3], "2":[4,5,6]}) # convert python object to cstl object
v["1"][2] = 10 # access cstl object
pv = cstl.topy(v) # convert cstl object to python object 
print(pv)
Vogel answered 29/3, 2023 at 15:58 Comment(0)
P
0

Lists are sequences.

see http://docs.python.org/tutorial/datastructures.html

append is like push_back, see the other methods as well.

Pattiepattin answered 9/1, 2011 at 1:3 Comment(0)
T
0

Python also has as part of the standard library an array type which is more efficient and the member type is constrained.

You may also look at numpy (not part of the standard library) if you need to get serious about efficient manipulation of large vectors/arrays.

Tret answered 9/1, 2011 at 2:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.