Hàng đợi hai đầu hoặc deque hỗ trợ thêm và xóa các phần tử ở một trong hai đầu. Các ngăn xếp và hàng đợi được sử dụng phổ biến hơn là các dạng hàng đợi suy biến, trong đó đầu vào và đầu ra được giới hạn ở một đầu duy nhất
import collections d = collections.deque['abcdefg'] print 'Deque:', d print 'Length:', len[d] print 'Left end:', d[0] print 'Right end:', d[-1] d.remove['c'] print 'remove[c]:', d
Vì danh sách là một loại bộ chứa trình tự nên chúng hỗ trợ một số thao tác tương tự mà danh sách hỗ trợ, chẳng hạn như kiểm tra nội dung bằng __getitem__[], xác định độ dài và loại bỏ các phần tử ở giữa bằng cách so khớp danh tính
$ python collections_deque.py Deque: deque[['a', 'b', 'c', 'd', 'e', 'f', 'g']] Length: 7 Left end: a Right end: g remove[c]: deque[['a', 'b', 'd', 'e', 'f', 'g']]
Dân cư
Một deque có thể được điền từ một trong hai đầu, được gọi là "trái" và "phải" trong triển khai Python
import collections # Add to the right d = collections.deque[] d.extend['abcdefg'] print 'extend :', d d.append['h'] print 'append :', d # Add to the left d = collections.deque[] d.extendleft['abcdefg'] print 'extendleft:', d d.appendleft['h'] print 'appendleft:', d
Lưu ý rằng extleft[] lặp lại đầu vào của nó và thực hiện tương đương với appendleft[] cho mỗi mục. Kết quả cuối cùng là hàng đợi chứa chuỗi đầu vào theo thứ tự ngược lại
$ python collections_deque_populating.py extend : deque[['a', 'b', 'c', 'd', 'e', 'f', 'g']] append : deque[['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']] extendleft: deque[['g', 'f', 'e', 'd', 'c', 'b', 'a']] appendleft: deque[['h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']]
tiêu thụ
Tương tự, các phần tử của deque có thể được tiêu thụ từ cả hai hoặc một trong hai đầu, tùy thuộc vào thuật toán được áp dụng
import collections print 'From the right:' d = collections.deque['abcdefg'] while True: try: print d.pop[] except IndexError: break print '\nFrom the left:' d = collections.deque['abcdefg'] while True: try: print d.popleft[] except IndexError: break
Sử dụng pop[] để xóa một mục khỏi đầu "bên phải" của hàng đợi và popleft[] để lấy từ đầu "bên trái"
$ python collections_deque_consuming.py From the right: g f e d c b a From the left: a b c d e f g
Vì deques an toàn cho luồng, nội dung thậm chí có thể được tiêu thụ từ cả hai đầu cùng lúc từ các luồng riêng biệt
import collections import threading import time candle = collections.deque[xrange[11]] def burn[direction, nextSource]: while True: try: next = nextSource[] except IndexError: break else: print '%8s: %s' % [direction, next] time.sleep[0.1] print '%8s done' % direction return left = threading.Thread[target=burn, args=['Left', candle.popleft]] right = threading.Thread[target=burn, args=['Right', candle.pop]] left.start[] right.start[] left.join[] right.join[]
Các luồng trong ví dụ này xen kẽ giữa mỗi đầu, loại bỏ các mục cho đến khi hàng đợi trống
$ python collections_deque_both_ends.py Left: 0 Right: 10 Right: 9 Left: 1 Right: 8 Left: 2 Right: 7 Left: 3 Right: 6 Left: 4 Right: 5 Left done Right done
xoay
Một khả năng hữu ích khác của bộ bài là xoay nó theo một trong hai hướng, để bỏ qua một số vật phẩm.
________số 8
Xoay hàng đợi sang phải [sử dụng phép quay dương] lấy các mục từ đầu bên phải và di chuyển chúng sang đầu bên trái. Xoay sang trái [với giá trị âm] lấy các mục từ đầu bên trái và di chuyển chúng sang đầu bên phải. Nó có thể giúp hình dung các mục trong deque như được khắc dọc theo cạnh của mặt số
# Nhập mô-đun bộ sưu tập
dq = bộ sưu tập. sau đó [[4, 5, 6]]
print["Nối 7 vào bên phải. ", danh sách[dq]]
print["Nối 3 vào bên trái. ", danh sách[dq]]
# Nối nhiều giá trị vào bên phải
print["Nối 8, 9 và 10 vào bên phải. ", danh sách [dq]]
# Nối nhiều giá trị vào bên trái
print["Nối 2 và 1 vào bên trái. ", danh sách[dq]]
print["Chèn -1 vào chỉ số 5. ", danh sách[dq]]
# Bật phần tử từ đầu bên phải
print["Xóa phần tử bên phải. ", danh sách[dq]]
# Bật phần tử từ đầu bên trái
print["Xóa phần tử bên trái. ", danh sách[dq]]
in["Xóa -1. ", danh sách [dq]]
# Đếm số lần 5 xảy ra
print["Đếm số lần 5 xuất hiện. ", tôi]
# Trả về chỉ số '7' nếu tìm thấy giữa chỉ số 4 và 6
print["Tìm chỉ số của số 7 giữa chỉ số 4 và 6. ", tôi]
# Xoay boong ba lần sang phải
print["Xoay bộ bài sang phải 3 lần. ", danh sách [dq]]
# Đảo ngược toàn bộ deque
print["Đảo ngược bộ bài. ", danh sách[dq]]