Python Data Structures
# Dictionary
print(type({}))
print(type({1: 1}))
# Set
print(type({1}))
print(type(set()))
from collections import defaultdict
d = defaultdict(int)
d[3] += 1
print(d)
f = defaultdict(lambda: 0)
f[3] += 1
print(f)
import heapq
l = [1, 4, 3, 2, 35, 1]
heapq.heapify(l)
while len(l) > 0:
    print(heapq.heappop(l))
from collections import deque
  
stack = deque()
  
# append() function to push element in the stack
stack.append('a')
stack.append('b')
stack.append('c')
  
print('Initial stack:')
print(stack)
  
# pop() function to pop element from stack in LIFO order
print('\nElements popped from stack:')
print(stack.pop())
print(stack.pop())
print(stack.pop())
  
print('\nStack after elements are popped:')
print(stack)
  
# uncommenting print(stack.pop()) will cause an IndexError as the stack is now empty
stack = []
  
# append() function to push element in the stack
stack.append('a')
stack.append('b')
stack.append('c')
  
print('Initial stack')
print(stack)
  
# pop() function to pop element from stack in LIFO order
print('\nElements popped from stack:')
print(stack.pop())
print(stack.pop())
print(stack.pop())
  
print('\nStack after elements are popped:')
print(stack)
  
# uncommenting print(stack.pop()) will cause an IndexError as the stack is now empty
from collections import deque
  
# Initializing a queue
q = deque()
  
# Adding elements to a queue
q.append('a')
q.append('b')
q.append('c')
  
print("Initial queue")
print(q)
  
# Removing elements from a queue
print("\nElements dequeued from the queue")
print(q.popleft())
print(q.popleft())
print(q.popleft())
  
print("\nQueue after removing elements")
print(q)
  
# Uncommenting q.popleft() will raise an IndexError as queue is now empty