Struktur data Python3


Dalam bab ini kami terutamanya memperkenalkan struktur data Python berdasarkan mata pengetahuan yang dipelajari sebelum ini.


Senarai

Senarai dalam Python adalah boleh ubah Ini adalah ciri paling penting yang membezakannya daripada rentetan dan tupel Dalam satu ayat, senarai boleh diubah suai, dan Rentetan dan tupel tidak boleh .

Berikut ialah kaedah untuk senarai dalam Python:

方法描述
list.append(x)把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]。
list.extend(L)通过添加指定列表的所有元素来扩充列表,相当于 a[len(a):] = L。
list.insert(i, x)在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,例如 a.insert(0, x) 会插入到整个列表之前,而 a.insert(len(a), x) 相当于 a.append(x) 。
list.remove(x)删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。
list.pop([i])从列表的指定位置删除元素,并将其返回。如果没有指定索引,a.pop()返回最后一个元素。元素随即从列表中被删除。(方法中 i 两边的方括号表示这个参数是可选的,而不是要求你输入一对方括号,你会经常在 Python 库参考手册中遇到这样的标记。)
list.clear()移除列表中的所有项,等于del a[:]。
list.index(x)返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。
list.count(x)返回 x 在列表中出现的次数。
list.sort()对列表中的元素进行排序。
list.reverse()倒排列表中的元素。
list.copy()返回列表的浅复制,等于a[:]。

Contoh berikut menunjukkan kebanyakan kaedah senarai:

>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]

Nota: Kaedah yang mengubah suai senarai seperti memasukkan, mengalih keluar atau mengisih tidak mempunyai nilai pulangan.


Gunakan senarai sebagai tindanan

Kaedah senarai memudahkan untuk menggunakan senarai sebagai tindanan ialah struktur data tertentu Elemen pertama yang dimasukkan adalah yang terakhir satu untuk dilepaskan (Masuk terakhir, keluar dahulu). Gunakan kaedah append() untuk menambah elemen pada bahagian atas tindanan. Satu elemen boleh dilepaskan dari bahagian atas timbunan menggunakan kaedah pop() tanpa menyatakan indeks. Contohnya:

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]

Gunakan senarai sebagai baris gilir

Anda juga boleh menggunakan senarai sebagai baris gilir, tetapi elemen pertama yang ditambahkan pada baris gilir adalah yang pertama dikeluarkan ; tetapi jika Senarai tidak cekap untuk tujuan ini. Menambah atau memunculkan elemen dari penghujung senarai adalah pantas, tetapi memasukkan atau memunculkan elemen dari ketua senarai bukanlah pantas (kerana semua elemen lain perlu dialihkan satu demi satu).

>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry")           # Terry arrives
>>> queue.append("Graham")          # Graham arrives
>>> queue.popleft()                 # The first to arrive now leaves
'Eric'
>>> queue.popleft()                 # The second to arrive now leaves
'John'
>>> queue                           # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])

Senaraikan pemahaman

Kefahaman senarai menyediakan cara mudah untuk membuat senarai daripada jujukan. Lazimnya aplikasi menggunakan beberapa operasi pada setiap elemen jujukan dan menggunakan hasilnya sebagai elemen untuk menjana senarai baharu atau mencipta jujukan berdasarkan kriteria tertentu.

Setiap pemahaman senarai bermula dengan untuk diikuti dengan ungkapan, dan kemudian sifar atau lebih untuk atau jika klausa. Hasil pulangan ialah senarai yang dijana daripada yang berikut untuk dan jika konteks berdasarkan ungkapan. Jika anda mahu ungkapan itu menghasilkan tupel, anda mesti menggunakan kurungan.

Di sini kita darabkan setiap nilai dalam senarai dengan tiga untuk mendapatkan senarai baharu:

>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]

Sekarang kita bermain helah kecil:

>>> [[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]

Di sini kita darabkan setiap nilai dalam jujukan Panggil kaedah satu elemen pada satu masa:

>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']

Kita boleh gunakan klausa if sebagai penapis:

>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]

Berikut ialah beberapa demonstrasi gelung dan teknik lain:

>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
>>> [vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]

Senarai Pemahaman boleh menggunakan ungkapan kompleks atau fungsi bersarang:

>>> [str(round(355/113, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

Analisis senarai bersarang

Senarai python juga boleh disarang.

Contoh berikut menunjukkan senarai matriks 3X4:

>>> matrix = [
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12],
... ]

Contoh berikut menukar senarai matriks 3X4 kepada senarai 4X3:

>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

Contoh berikut juga boleh dilaksanakan menggunakan kaedah berikut :

>>> transposed = []
>>> for i in range(4):
...     transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

Kaedah pelaksanaan lain:

>>> transposed = []
>>> for i in range(4):
...     # the following 3 lines implement the nested listcomp
...     transposed_row = []
...     for row in matrix:
...         transposed_row.append(row[i])
...     transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

pernyataan del

Gunakan pernyataan del untuk memadamkan elemen daripada senarai mengikut indeks dan bukannya nilai. Ini berbeza daripada menggunakan pop() untuk mengembalikan nilai. Anda boleh menggunakan pernyataan del untuk memadamkan potongan daripada senarai, atau untuk mengosongkan keseluruhan senarai (kaedah yang kami perkenalkan sebelum ini adalah untuk menetapkan senarai kosong kepada potongan). Contohnya:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]

Anda juga boleh menggunakan del untuk memadamkan pembolehubah entiti:

>>> del a

Tuple dan jujukan

Tuple terdiri daripada beberapa nilai yang dipisahkan koma, untuk contoh:

>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

Seperti yang anda lihat, tupel sentiasa dikeluarkan dengan kurungan untuk memudahkan ekspresi yang betul bagi struktur bersarang. Ia mungkin atau mungkin tidak dimasukkan dengan atau tanpa kurungan, tetapi kurungan biasanya diperlukan (jika tupel adalah sebahagian daripada ungkapan yang lebih besar).


Set

Set ialah set tidak tertib unsur tidak berulang. Kefungsian asas termasuk ujian perhubungan dan penghapusan elemen pendua.

Koleksi boleh dibuat menggunakan kurungan kerinting ({}). Nota: Jika anda ingin mencipta koleksi kosong, anda mesti menggunakan set() dan bukannya {}; yang terakhir mencipta kamus kosong, struktur data yang akan kami perkenalkan dalam bahagian seterusnya.

Berikut ialah demonstrasi mudah:

>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)                      # show that duplicates have been removed
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket                 # fast membership testing
True
>>> 'crabgrass' in basket
False

>>> # Demonstrate set operations on unique letters from two words
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # letters in a but not in b
{'r', 'd', 'b'}
>>> a | b                              # letters in either a or b
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # letters in both a and b
{'a', 'c'}
>>> a ^ b                              # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)                      # show that duplicates have been removed
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket                 # fast membership testing
True
>>> 'crabgrass' in basket
False

>>> # Demonstrate set operations on unique letters from two words
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # letters in a but not in b
{'r', 'd', 'b'}
>>> a | b                              # letters in either a or b
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # letters in both a and b
{'a', 'c'}
>>> a ^ b                              # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}

Koleksi juga menyokong pemahaman:

>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}

Kamus

Satu lagi pengenalan Python yang sangat berguna Jenis data terbina ialah kamus. Tidak seperti urutan

, yang diindeks oleh integer berterusan, kamus diindeks oleh kata kunci, yang boleh menjadi sebarang jenis tidak berubah, biasanya rentetan atau nilai angka.

Cara terbaik untuk memahami kamus ialah menganggapnya sebagai koleksi pasangan nilai => kunci yang tidak tersusun. Dalam kamus yang sama, kata kunci mestilah berbeza antara satu sama lain.

Sepasang pendakap kerinting mencipta kamus kosong: {}.

Ini ialah contoh mudah penggunaan kamus:

>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False

Pembina dict() membina kamus terus daripada senarai tuple pasangan nilai kunci. Pemahaman senarai menentukan pasangan nilai kunci tertentu jika terdapat corak tetap:

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}

Selain itu, pemahaman kamus boleh digunakan untuk mencipta kamus ungkapan kunci dan nilai arbitrari:

>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

jika kata kunci Just a rentetan mudah, kadangkala lebih mudah untuk menggunakan parameter kata kunci untuk menentukan pasangan nilai kunci:

>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}

Petua Traversal

Apabila merentasi dalam kamus, kata kunci dan nilai yang sepadan boleh Gunakan kaedah item() untuk mentafsirnya secara serentak:

>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
...     print(k, v)
...
gallahad the pure
robin the brave

Apabila melintasi dalam jujukan, kedudukan indeks dan nilai yang sepadan boleh diperolehi serentak menggunakan fungsi enumerate():

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...     print(i, v)
...
0 tic
1 tac
2 toe

Traverse dua atau lebih pada masa yang sama Urutan boleh digabungkan menggunakan zip():

>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
...     print('What is your {0}?  It is {1}.'.format(q, a))
...
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.

Untuk melintasi jujukan secara terbalik, mula-mula nyatakan jujukan, dan kemudian panggil fungsi reversesd():

>>> for i in reversed(range(1, 10, 2)):
...     print(i)
...
9
7
5
3
1

Untuk melintasi jujukan mengikut tertib, Gunakan fungsi sorted() untuk mengembalikan jujukan diisih tanpa mengubah suai nilai asal:

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
...     print(f)
...
apple
banana
orange
pear

Lihat dokumentasi

  • Senarai Python3

  • Python3 tuple

  • Kamus Python3