数据结构 | 元组

2019-07-16  本文已影响0人  简子逍

基本用法

  1. 创建元组
tup1 = ()    # 创建一个空元组
tup2 = (1,)  # 当元组内只有一个元素时,需要在元素后面添加逗号
tup3 = (1, 2, 3)
  1. 修改元组

元组内的元素一旦创立后是不可改变的,但可以对元组进行连接组合。

# 连接元组
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
tup3 = tup1 + tup2
print(tup3)  # (12, 34.56, 'abc', 'xyz')

# 删除元组
del tup3
print(tup3)  # NameError: name 'tup3' is not defined

元组内置方法

car = ['audi', 'bmw', 'benchi', 'lingzhi']
print(len(car))  # 4

tuple1 = ('5', '4', '8')
print(max(tuple1))  # 8
print(min(tuple1))  # 4

list1 = car
tuple1 = tuple(list1)
print(tuple1)  # ('audi', 'bmw', 'benchi', 'lingzhi')

序列分解

Python 允许任何序列(或可迭代对象)通过简单的赋值操作分解为单独的变量,要求是变量的总数和结构要与序列相吻合

p = (4, 5, 6)
x, y, z = p
print(x)  # 4
print(y)  # 5
print(z)  # 6

x, y = p
print(x, y)  # ValueError: too many values to unpack (expected 2)

星号表达式

适用于分解未知或任意长度的可迭代对象。参数使用了*args,关于其详细用法参见 Python | 动态参数的使用

records = [
    ('A', 1, 2),
    ('B', 'hello'),
    ('C', 5, 3)
]

def do_A(x, y):
    print('A', x, y)

def do_B(s):
    print('B', s)

for tag, *args in records:
    if tag == 'A':
        do_A(*args)
    elif tag == 'B':
        do_B(*args)

# 输出结果
A 1 2
B hello
line = 'www.computer.com/dsffe-3fdcd.d/we/index.html'
domain, *uri, file = line.split('/')
print(domain)  # www.computer.com
print(file)    # index.html

优先级队列

使用内置模块heapq实现一个简单的优先级队列。

import heapq

class PriorityQueue:
    def __init__(self):
        self._queue = []
        self._index = 0

    def push(self, item, priority):
        heapq.heappush(self._queue, (-priority, self._index, item))
        self._index += 1

    def pop(self):
        return heapq.heappop(self._queue)[-1]


class Item:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return 'Item({!r})'.format(self.name)

q = PriorityQueue()
q.push(Item('A'), 1)
q.push(Item('B'), 4)
q.push(Item('C'), 5)
q.push(Item('D'), 1)
print(q.pop())  # Item('C')
print(q.pop())  # Item('B')
print(q.pop())  # Item('A')

上述代码中,每次执行pop()操作时返回的元素具有最高的优先级,拥有相同优先级的两个元素返回的顺序,同插入到队列时的顺序相同。

函数heapq.heappush()heapq.heappop()分别实现了列表_queue中元素的插入和移除操作,并且保证列表中第一个元素的优先级最低。一般情况下,堆是按从小到大的顺序进行排序的,和优先队列相反。因此在 push()函数中使用了负的priority值。_index的作用是通过维护一个不断递增的索引,将具有相同优先级的元素以加入队列时的顺序排列。

上一篇下一篇

猜你喜欢

热点阅读