首頁  >  文章  >  後端開發  >  實例詳解Python元組

實例詳解Python元組

WBOY
WBOY轉載
2022-03-14 17:46:092427瀏覽

本篇文章為大家帶來了關於python的相關知識,其中主要介紹了關於元組的相關問題,包括了元組的創建、訪問、修改、刪除和內置方法等,希望對大家有幫助。

實例詳解Python元組

推薦學習:python教程

#引言——在Python中,透過資料結構來保存專案中重要的資料訊息。 Python語言內建了多種資料結構,例如列表,元組,字典和集合等。本堂課我們來講一講Python中舉足輕重的一大資料結構-元組。

在Python中,我們可以將元組視為一種特殊的清單。它與清單唯一的不同在於:元組內的資料元素不能發生改變【這個不變──不但不能改變其中的資料項,而且也不能新增和刪除資料項! 】。當我們需要建立一組不可改變的資料時,通常是將這些資料放進元組~

#1.元組的建立&& 存取

(1)元群組的創建:

在Python中,創建元組的基本形式是以小括號“()”將資料元素括起來,各個元素之間用逗號“,”隔開。
如下:

tuple1 = ('xiaoming', 'xiaohong', 18, 21)
tuple2 = (1, 2, 3, 4, 5)

# 而且——是可以创建空元组哦!
tuple3 = ()

# 小注意——如果你创建的元组只包含一个元素时,也不要忘记在元素后面加上逗号。让其识别为一个元组:
tuple4 = (22, )

(2)存取:

元組和字串以及清單類似,索引都是從0開始,並且可以進行截取和組合等操作。
如下:

tuple1 = ('xiaoming', 'xiaohong', 18, 21)
tuple2 = (1, 2, 3, 4, 5)

# 显示元组中索引为1的元素的值
print("tuple1[1]:", tuple1[0])

# 显示元组中索引从1到3的元素的值
print("tuple2[1:3]:", tuple2[1:3])

實例詳解Python元組

2.元組的修改&& 刪除

(1)元組的修改:

雖然在開頭就說元組不可變,但它還是有個被支持的騷操作-元組之間進行連接組合:

tuple1 = ('xiaoming', 'xiaohong', 18, 21)
tuple2 = (1, 2, 3, 4, 5)

tuple_new = tuple1 + tuple2
print(tuple_new)

實例詳解Python元組

#(1)元組的刪除:

雖然元組不可變,但卻可以透過del語句刪除整個元組。
如下:

tuple1 = ('xiaoming', 'xiaohong', 18, 21)

print(tuple1)		# 正常打印tuple1

del tuple1

print(tuple1)		# 因为上面删除了tuple1,所以再打印会报错哦!

實例詳解Python元組

3. 元組的內建方法

元組是不可變,但我們可以透過使用內建方法來操作元組。常用的內建方法如下:

  1. len(tuple):計算元組元素個數;
  2. max(tuple):傳回元組中元素的最大值;
  3. min(tuple):傳回元組中元素的最小值;
  4. tuple(seq):將清單轉換為元組。

其實更多時候,我們是將元組先轉換為列表,操作之後再轉換為元組(因為列表有許多方法~)。

4.將序列分解為單獨的變數

(1)

Python允許將一個包含N個元素的元組或序列分別為N個單獨的變數。這是因為Python語法允許任何序列/可迭代物件透過簡單的賦值操作分解為單獨的變量,唯一的要求是變數的總數和結構要與序列相符。
如下:

tuple1 = (18, 22)
x, y = tuple1
print(x)
print(y)

tuple2 = ['xiaoming', 33, 19.8, (2012, 1, 11)]
name, age, level, date = tuple2
print(name)
print(date)

實例詳解Python元組

如果要分解未知或任意長度的可迭代對象,上述分解運算豈不直接很nice!通常在這類可迭代物件中會有一些已知的元件或模式(例如:元素1之後的所有內容都是電話號碼),利用「*」星號表達式分解可迭代物件後,使得開發者能輕鬆利用這些模式,而無須在可迭代物件中做複雜操作就能得到相關的元素。

在Python中,星號表達式在迭代一個變長的元組序列時十分有用。如下示範分解一個待標記元組序列的過程。

records = [
    ('AAA', 1, 2),
    ('BBB', 'hello'),
    ('CCC', 5, 3)
]

def do_foo(x, y):
    print('AAA', x, y)

def do_bar(s):
    print('BBB', s)

for tag, *args in records:
    if tag == 'AAA':
        do_foo(*args)
    elif tag == 'BBB':
        do_bar(*args)

line = 'guan:ijing234://wef:678d:guan'
uname, *fields, homedir, sh = line.split(':')
print(uname)
print(*fields)
print(homedir)
print(sh)

實例詳解Python元組

(2)

#在Python中迭代處理清單或元組等序列時,有時需要統計最後幾項記錄以實現歷史記錄統計功能。

使用內建的deque實作:

from _collections import deque

q = deque(maxlen=3)
q.append(1)
q.append(2)
q.append(3)
print(q)
q.append(4)
print(q)

實例詳解Python元組

#如下-示範了將序列中的最後幾項作為歷史記錄的過程。

from _collections import deque

def search(lines, pattern, history=5):
    previous_lines = deque(maxlen=history)

    for line in lines:
        if pattern in line:
            yield line, previous_lines
        previous_lines.append(line)
# Example use on a file
if __name__ == '__main__':
    with open('123.txt') as f:
        for line, prevlines in search(f, 'python', 5):
            for pline in prevlines:	# 包含python的行
                print(pline)  # print (pline, end='')
            # 打印最后检查过的N行文本
            print(line)  # print (pline, end='')

123.txt:

pythonpythonpythonpythonpythonpythonpython

python


python

實例詳解Python元組

#

在上述代码中,对一系列文本行实现了简单的文本匹配操作,当发现有合适的匹配时,就输出当前的匹配行以及最后检查过的N行文本。使用deque(maxlen=N)创建了一个固定长度的队列。当有新记录加入而使得队列变成已满状态时,会自动移除最老的那条记录。当编写搜索某项记录的代码时,通常会用到含有yield关键字的生成器函数,它能够将处理搜索过程的代码和使用搜索结果的代码成功解耦开来。

5.实现优先级队列

使用内置模块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('AAA'), 1)
q.push(Item('BBB'), 4)
q.push(Item('CCC'), 5)
q.push(Item('DDD'), 1)
print(q.pop())
print(q.pop())
print(q.pop())

在上述代码中,利用heapq模块实现了一个简单的优先级队列,第一次执行pop()操作时返回的元素具有最高的优先级。
拥有相同优先级的两个元素(foo和grok)返回的顺序,同插入到队列时的顺序相同。

函数heapq.heappush()和heapq.heappop()分别实现了列表_queue中元素的插入和移除操作,并且保证列表中的第一个元素的优先级最低。

函数heappop()总是返回“最小”的元素,并且因为push和pop操作的复杂度都是O(log2N),其中N代表堆中元素的数量,因此就算N的值很大,这些操作的效率也非常高。

上述代码中的队列以元组 (-priority, index, item)的形式组成,priority取负值是为了让队列能够按元素的优先级从高到底排列。这和正常的堆排列顺序相反,一般情况下,堆是按从小到大的顺序进行排序的。变量index的作用是将具有相同优先级的元素以适当的顺序排列,通过维护一个不断递增的索引,元素将以它们加入队列时的顺序排列。但是当index在对具有相同优先级的元素间进行比较操作,同样扮演一个重要的角色。

在Python中,如果以元组(priority, item)的形式存储元素,只要它们的优先级不同,它们就可以进行比较。但是如果两个元组的优先级相同,在进行比较操作时会失败。这时可以考虑引入一个额外的索引值,以(priority, index, item)的方式建立元组,因为没有哪两个元组会有相同的index值,所以这样就可以完全避免上述问题。一旦比较操作的结果可以确定,Python就不会再去比较剩下的元组元素了。

如下——演示了实现一个简单的优先级队列的过程:

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)

# ①
a = Item('AAA')     
b = Item('BBB')
#a 

實例詳解Python元組

在上述代码中,因为在1-2中没有添加所以,所以当两个元组的优先级相同时会出错;而在3-4中添加了索引,这样就不会出错了!

推荐学习:python学习教程

以上是實例詳解Python元組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除