Python Language
Lista
Szukaj…
Wprowadzenie
Lista Python jest ogólną strukturą danych szeroko stosowaną w programach Python. Można je znaleźć w innych językach, często nazywanych tablicami dynamicznymi . Są to zarówno zmienne, jak i sekwencyjny typ danych, który pozwala na ich indeksowanie i dzielenie . Lista może zawierać różne typy obiektów, w tym inne obiekty listy.
Składnia
- [wartość, wartość, ...]
- lista ([iterowalna])
Uwagi
list
jest szczególnym typem iterowalnym, ale nie jest jedynym, który istnieje w Pythonie. Czasami lepiej będzie użyć set
, tuple
lub dictionary
list
to nazwa nadana w Pythonie dynamicznym tablicom (podobna do vector<void*>
z C ++ lub Java's ArrayList<Object>
). To nie jest lista połączona.
Dostęp do elementów odbywa się w stałym czasie i jest bardzo szybki. Dołączanie elementów na końcu listy jest amortyzowane przez stały czas, ale raz na jakiś czas może wiązać się z alokacją i kopiowaniem całej list
.
Zrozumienia listy są powiązane z listami.
Dostęp do wartości listy
Listy w języku Python są indeksowane od zera i działają jak tablice w innych językach.
lst = [1, 2, 3, 4]
lst[0] # 1
lst[1] # 2
Próba uzyskania dostępu do indeksu poza granicami listy spowoduje błąd IndexError
.
lst[4] # IndexError: list index out of range
Wskaźniki ujemne są interpretowane jako liczenie od końca listy.
lst[-1] # 4
lst[-2] # 3
lst[-5] # IndexError: list index out of range
Jest to funkcjonalnie równoważne z
lst[len(lst)-1] # 4
Listy pozwalają na stosowanie notacji plastra jako lst[start:end:step]
. Dane wyjściowe notacji wycinka to nowa lista zawierająca elementy od start
indeksu do end-1
. Jeśli opcje są pomijane start
ustawienia domyślne na początek listy, end
do końca listy i step
do 1:
lst[1:] # [2, 3, 4]
lst[:3] # [1, 2, 3]
lst[::2] # [1, 3]
lst[::-1] # [4, 3, 2, 1]
lst[-1:0:-1] # [4, 3, 2]
lst[5:8] # [] since starting index is greater than length of lst, returns empty list
lst[1:10] # [2, 3, 4] same as omitting ending index
Mając to na uwadze, możesz wydrukować odwróconą wersję listy, dzwoniąc
lst[::-1] # [4, 3, 2, 1]
Podczas korzystania z długości kroków o wartości ujemnej indeks początkowy musi być większy niż indeks końcowy, w przeciwnym razie wynikiem będzie pusta lista.
lst[3:1:-1] # [4, 3]
Użycie ujemnych wskaźników kroków jest równoważne z następującym kodem:
reversed(lst)[0:2] # 0 = 1 -1
# 2 = 3 -1
Zastosowane wskaźniki są o 1 mniejsze niż te stosowane w indeksowaniu ujemnym i są odwrócone.
Zaawansowane krojenie
Podczas __getitem__()
list wywoływana jest metoda __getitem__()
obiektu listy z obiektem slice
. Python ma wbudowaną metodę wycinania do generowania obiektów wycinków. Możemy to wykorzystać do przechowywania plastra i ponownego użycia go później,
data = 'chandan purohit 22 2000' #assuming data fields of fixed length
name_slice = slice(0,19)
age_slice = slice(19,21)
salary_slice = slice(22,None)
#now we can have more readable slices
print(data[name_slice]) #chandan purohit
print(data[age_slice]) #'22'
print(data[salary_slice]) #'2000'
Może to być bardzo przydatne, zapewniając funkcję krojenia naszych obiektów, zastępując __getitem__
w naszej klasie.
Wymień metody i obsługiwane operatory
Zaczynając z danej listy a
:
a = [1, 2, 3, 4, 5]
append(value)
- dołącza nowy element na końcu listy.# Append values 6, 7, and 7 to the list a.append(6) a.append(7) a.append(7) # a: [1, 2, 3, 4, 5, 6, 7, 7] # Append another list b = [8, 9] a.append(b) # a: [1, 2, 3, 4, 5, 6, 7, 7, [8, 9]] # Append an element of a different type, as list elements do not need to have the same type my_string = "hello world" a.append(my_string) # a: [1, 2, 3, 4, 5, 6, 7, 7, [8, 9], "hello world"]
Zauważ, że metoda
append()
dołącza tylko jeden nowy element na końcu listy. Jeśli dodasz listę do innej listy, dołączana lista stanie się pojedynczym elementem na końcu pierwszej listy.# Appending a list to another list a = [1, 2, 3, 4, 5, 6, 7, 7] b = [8, 9] a.append(b) # a: [1, 2, 3, 4, 5, 6, 7, 7, [8, 9]] a[8] # Returns: [8,9]
extend(enumerable)
- rozszerza listę poprzez dodanie elementów z innego enumerable.a = [1, 2, 3, 4, 5, 6, 7, 7] b = [8, 9, 10] # Extend list by appending all elements from b a.extend(b) # a: [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10] # Extend list with elements from a non-list enumerable: a.extend(range(3)) # a: [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 0, 1, 2]
Listy można również łączyć z operatorem
+
. Pamiętaj, że nie zmienia to żadnej z oryginalnych list:a = [1, 2, 3, 4, 5, 6] + [7, 7] + b # a: [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10]
index(value, [startIndex])
- pobiera indeks pierwszego wystąpienia wartości wejściowej. Jeśli wartości wejściowej nie ma na liście,ValueError
jest wyjątekValueError
. Jeśli podany zostanie drugi argument, wyszukiwanie rozpocznie się od określonego indeksu.a.index(7) # Returns: 6 a.index(49) # ValueError, because 49 is not in a. a.index(7, 7) # Returns: 7 a.index(7, 8) # ValueError, because there is no 7 starting at index 8
insert(index, value)
- wstawiavalue
tuż przed określonymindex
. Zatem po wstawieniu nowy element zajmujeindex
pozycji.a.insert(0, 0) # insert 0 at position 0 a.insert(2, 5) # insert 5 at position 2 # a: [0, 1, 5, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10]
pop([index])
- usuwa i zwraca element oindex
. Bez argumentu usuwa i zwraca ostatni element listy.a.pop(2) # Returns: 5 # a: [0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10] a.pop(8) # Returns: 7 # a: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # With no argument: a.pop() # Returns: 10 # a: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
remove(value)
- usuwa pierwsze wystąpienie określonej wartości. Jeśli nie można znaleźć podanej wartości,ValueError
jest błądValueError
.a.remove(0) a.remove(9) # a: [1, 2, 3, 4, 5, 6, 7, 8] a.remove(10) # ValueError, because 10 is not in a
reverse()
- odwraca listę w miejscu i zwracaNone
.a.reverse() # a: [8, 7, 6, 5, 4, 3, 2, 1]
Istnieją również inne sposoby cofania listy .
count(value)
- zlicza liczbę wystąpień pewnej wartości na liście.a.count(7) # Returns: 2
sort()
- sortuje listę w kolejności numerycznej i leksykograficznej i zwracaNone
.a.sort() # a = [1, 2, 3, 4, 5, 6, 7, 8] # Sorts the list in numerical order
Listy można również odwrócić podczas sortowania przy użyciu flagi
reverse=True
w metodziesort()
.a.sort(reverse=True) # a = [8, 7, 6, 5, 4, 3, 2, 1]
Jeśli chcesz, aby posortować według atrybutów elementów, można użyć
key
argumentu słowa kluczowego:import datetime class Person(object): def __init__(self, name, birthday, height): self.name = name self.birthday = birthday self.height = height def __repr__(self): return self.name l = [Person("John Cena", datetime.date(1992, 9, 12), 175), Person("Chuck Norris", datetime.date(1990, 8, 28), 180), Person("Jon Skeet", datetime.date(1991, 7, 6), 185)] l.sort(key=lambda item: item.name) # l: [Chuck Norris, John Cena, Jon Skeet] l.sort(key=lambda item: item.birthday) # l: [Chuck Norris, Jon Skeet, John Cena] l.sort(key=lambda item: item.height) # l: [John Cena, Chuck Norris, Jon Skeet]
W przypadku listy nagrań koncepcja jest taka sama:
import datetime l = [{'name':'John Cena', 'birthday': datetime.date(1992, 9, 12),'height': 175}, {'name': 'Chuck Norris', 'birthday': datetime.date(1990, 8, 28),'height': 180}, {'name': 'Jon Skeet', 'birthday': datetime.date(1991, 7, 6), 'height': 185}] l.sort(key=lambda item: item['name']) # l: [Chuck Norris, John Cena, Jon Skeet] l.sort(key=lambda item: item['birthday']) # l: [Chuck Norris, Jon Skeet, John Cena] l.sort(key=lambda item: item['height']) # l: [John Cena, Chuck Norris, Jon Skeet]
Sortuj według słownika:
import datetime l = [{'name':'John Cena', 'birthday': datetime.date(1992, 9, 12),'size': {'height': 175, 'weight': 100}}, {'name': 'Chuck Norris', 'birthday': datetime.date(1990, 8, 28),'size' : {'height': 180, 'weight': 90}}, {'name': 'Jon Skeet', 'birthday': datetime.date(1991, 7, 6), 'size': {'height': 185, 'weight': 110}}] l.sort(key=lambda item: item['size']['height']) # l: [John Cena, Chuck Norris, Jon Skeet]
Lepszy sposób sortowania za pomocą attrgetter
i itemgetter
Listy można również sortować za pomocą funkcji attrgetter
i itemgetter
z modułu operatora. Mogą one pomóc poprawić czytelność i możliwość ponownego użycia. Oto kilka przykładów
from operator import itemgetter,attrgetter
people = [{'name':'chandan','age':20,'salary':2000},
{'name':'chetan','age':18,'salary':5000},
{'name':'guru','age':30,'salary':3000}]
by_age = itemgetter('age')
by_salary = itemgetter('salary')
people.sort(key=by_age) #in-place sorting by age
people.sort(key=by_salary) #in-place sorting by salary
itemgetter
może również otrzymać indeks. Jest to pomocne, jeśli chcesz sortować na podstawie indeksów krotki.
list_of_tuples = [(1,2), (3,4), (5,0)]
list_of_tuples.sort(key=itemgetter(1))
print(list_of_tuples) #[(5, 0), (1, 2), (3, 4)]
Użyj attrgetter
jeśli chcesz sortować według atrybutów obiektu,
persons = [Person("John Cena", datetime.date(1992, 9, 12), 175),
Person("Chuck Norris", datetime.date(1990, 8, 28), 180),
Person("Jon Skeet", datetime.date(1991, 7, 6), 185)] #reusing Person class from above example
person.sort(key=attrgetter('name')) #sort by name
by_birthday = attrgetter('birthday')
person.sort(key=by_birthday) #sort by birthday
clear()
- usuwa wszystkie elementy z listya.clear() # a = []
Replikacja - pomnożenie istniejącej listy przez liczbę całkowitą spowoduje utworzenie większej listy składającej się z tylu kopii oryginału. Może to być przydatne na przykład do inicjowania listy:
b = ["blah"] * 3 # b = ["blah", "blah", "blah"] b = [1, 3, 5] * 5 # [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5]
Zachowaj ostrożność, jeśli twoja lista zawiera odniesienia do obiektów (np. Listę list), zobacz Często spotykane pułapki - Mnożenie list i wspólne odniesienia .
Usuwanie elementu - możliwe jest usunięcie wielu elementów z listy za pomocą słowa kluczowego
del
i notacji plastra:a = list(range(10)) del a[::2] # a = [1, 3, 5, 7, 9] del a[-1] # a = [1, 3, 5, 7] del a[:] # a = []
Biurowy
Domyślne przypisanie „=” przypisuje odwołanie oryginalnej listy do nowej nazwy. Oznacza to, że pierwotna nazwa i nowa nazwa wskazują ten sam obiekt listy. Zmiany dokonane za pomocą jednego z nich zostaną odzwierciedlone w innym. Często to nie jest to, co zamierzałeś.
b = a a.append(6) # b: [1, 2, 3, 4, 5, 6]
Jeśli chcesz utworzyć kopię listy, masz poniższe opcje.
Możesz pokroić:
new_list = old_list[:]
Możesz użyć wbudowanej funkcji list ():
new_list = list(old_list)
Możesz użyć ogólnego copy.copy ():
import copy new_list = copy.copy(old_list) #inserts references to the objects found in the original.
Jest to trochę wolniejsze niż list (), ponieważ najpierw musi znaleźć typ danych old_list.
Jeśli lista zawiera obiekty, a także chcesz je skopiować, użyj standardowego copy.deepcopy ():
import copy new_list = copy.deepcopy(old_list) #inserts copies of the objects found in the original.
Oczywiście najwolniejsza i najbardziej wymagająca pamięci metoda, ale czasem nieunikniona.
copy()
- Zwraca płytką kopię listy
aa = a.copy()
# aa = [1, 2, 3, 4, 5]
Długość listy
Użyj len()
aby uzyskać jednowymiarową długość listy.
len(['one', 'two']) # returns 2
len(['one', [2, 3], 'four']) # returns 3, not 4
len()
działa również na ciągi, słowniki i inne struktury danych podobne do list.
Zauważ, że len()
jest wbudowaną funkcją, a nie metodą obiektu listy.
Zauważ też, że koszt len()
wynosi O(1)
, co oznacza, że uzyskanie takiej samej liczby zajmie tyle samo czasu, niezależnie od jego długości.
Iterowanie po liście
Python obsługuje używanie pętli for
bezpośrednio na liście:
my_list = ['foo', 'bar', 'baz']
for item in my_list:
print(item)
# Output: foo
# Output: bar
# Output: baz
Możesz także uzyskać pozycję każdego elementu w tym samym czasie:
for (index, item) in enumerate(my_list):
print('The item in position {} is: {}'.format(index, item))
# Output: The item in position 0 is: foo
# Output: The item in position 1 is: bar
# Output: The item in position 2 is: baz
Inny sposób iteracji listy na podstawie wartości indeksu:
for i in range(0,len(my_list)):
print(my_list[i])
#output:
>>>
foo
bar
baz
Pamiętaj, że zmiana elementów na liście podczas iteracji na niej może mieć nieoczekiwane rezultaty:
for item in my_list:
if item == 'foo':
del my_list[0]
print(item)
# Output: foo
# Output: baz
W tym ostatnim przykładzie usunęliśmy pierwszy element przy pierwszej iteracji, ale spowodowało to pominięcie bar
.
Sprawdzanie, czy element znajduje się na liście
W Pythonie bardzo łatwo jest sprawdzić, czy element znajduje się na liście. Wystarczy użyć operatora in
.
lst = ['test', 'twest', 'tweast', 'treast']
'test' in lst
# Out: True
'toast' in lst
# Out: False
Uwaga: operator
in
na zestawach jest asymptotycznie szybszy niż na listach. Jeśli musisz go używać wiele razy na potencjalnie dużych listach, możesz przekonwertowaćlist
naset
i przetestować obecność elementów naset
.
slst = set(lst)
'test' in slst
# Out: True
Elementy listy cofania
Możesz użyć funkcji reversed
która zwraca iterator do odwróconej listy:
In [3]: rev = reversed(numbers)
In [4]: rev
Out[4]: [9, 8, 7, 6, 5, 4, 3, 2, 1]
Zauważ, że lista „liczb” pozostaje niezmieniona przez tę operację i pozostaje w tej samej kolejności, w jakiej była pierwotnie.
Aby odwrócić na miejscu, możesz również użyć metody reverse
.
Możesz także odwrócić listę (faktycznie uzyskując kopię, oryginalna lista pozostaje nienaruszona), używając składni krojenia, ustawiając trzeci argument (krok) na -1:
In [1]: numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
In [2]: numbers[::-1]
Out[2]: [9, 8, 7, 6, 5, 4, 3, 2, 1]
Sprawdzanie, czy lista jest pusta
Pustka listy jest powiązana z wartością logiczną False
, więc nie musisz sprawdzać len(lst) == 0
, ale tylko lst
czy not lst
lst = []
if not lst:
print("list is empty")
# Output: list is empty
Listy konkatenacji i scalania
Najprostszy sposób na konkatenację
list1
ilist2
:merged = list1 + list2
zip
zwraca listę krotek , w których i-ta krotka zawiera i-ty element z każdej sekwencji argumentów lub iterable:alist = ['a1', 'a2', 'a3'] blist = ['b1', 'b2', 'b3'] for a, b in zip(alist, blist): print(a, b) # Output: # a1 b1 # a2 b2 # a3 b3
Jeśli listy mają różne długości, wynik będzie zawierał tylko tyle elementów, co najkrótszy:
alist = ['a1', 'a2', 'a3'] blist = ['b1', 'b2', 'b3', 'b4'] for a, b in zip(alist, blist): print(a, b) # Output: # a1 b1 # a2 b2 # a3 b3 alist = [] len(list(zip(alist, blist))) # Output: # 0
Aby uzupełnić listy o nierównej długości do najdłuższej z
None
użyjitertools.zip_longest
(itertools.izip_longest
w Pythonie 2)alist = ['a1', 'a2', 'a3'] blist = ['b1'] clist = ['c1', 'c2', 'c3', 'c4'] for a,b,c in itertools.zip_longest(alist, blist, clist): print(a, b, c) # Output: # a1 b1 c1 # a2 None c2 # a3 None c3 # None None c4
Wstaw do określonych wartości indeksu:
alist = [123, 'xyz', 'zara', 'abc'] alist.insert(3, [2009]) print("Final List :", alist)
Wynik:
Final List : [123, 'xyz', 'zara', 2009, 'abc']
Dowolni i wszyscy
Możesz użyć all()
aby ustalić, czy wszystkie wartości w iterowalnej wartości mają wartość True
nums = [1, 1, 0, 1]
all(nums)
# False
chars = ['a', 'b', 'c', 'd']
all(chars)
# True
Podobnie any()
określa, czy jedna lub więcej wartości w iterowalnej wartości ma wartość True
nums = [1, 1, 0, 1]
any(nums)
# True
vals = [None, None, None, False]
any(vals)
# False
Chociaż w tym przykładzie użyto listy, ważne jest, aby pamiętać, że te wbudowane funkcje działają z dowolnym iterowalnym, w tym z generatorami.
vals = [1, 2, 3, 4]
any(val > 12 for val in vals)
# False
any((val * 2) > 6 for val in vals)
# True
Usuń zduplikowane wartości z listy
Usuwanie zduplikowanych wartości z listy można wykonać, przekształcając listę w set
(czyli nieuporządkowaną kolekcję różnych obiektów). Jeśli potrzebna jest struktura danych list
, zestaw można przekonwertować z powrotem na listę za pomocą funkcji list()
:
names = ["aixk", "duke", "edik", "tofp", "duke"]
list(set(names))
# Out: ['duke', 'tofp', 'aixk', 'edik']
Zauważ, że po przekonwertowaniu listy na zestaw oryginalne zamówienie zostaje utracone.
Aby zachować porządek na liście, można użyć polecenia OrderedDict
import collections
>>> collections.OrderedDict.fromkeys(names).keys()
# Out: ['aixk', 'duke', 'edik', 'tofp']
Dostęp do wartości z listy zagnieżdżonej
Zaczynając od trójwymiarowej listy:
alist = [[[1,2],[3,4]], [[5,6,7],[8,9,10], [12, 13, 14]]]
Dostęp do pozycji na liście:
print(alist[0][0][1])
#2
#Accesses second element in the first list in the first list
print(alist[1][1][2])
#10
#Accesses the third element in the second list in the second list
Wykonywanie operacji wsparcia:
alist[0][0].append(11)
print(alist[0][0][2])
#11
#Appends 11 to the end of the first list in the first list
Używanie zagnieżdżonych pętli do drukowania listy:
for row in alist: #One way to loop through nested lists
for col in row:
print(col)
#[1, 2, 11]
#[3, 4]
#[5, 6, 7]
#[8, 9, 10]
#[12, 13, 14]
Należy pamiętać, że ta operacja może być używana w zrozumieniu listy, a nawet jako generator do zwiększania wydajności, np .:
[col for row in alist for col in row]
#[[1, 2, 11], [3, 4], [5, 6, 7], [8, 9, 10], [12, 13, 14]]
Nie wszystkie pozycje na listach zewnętrznych muszą być same listami:
alist[1].insert(2, 15)
#Inserts 15 into the third position in the second list
Kolejny sposób użycia zagnieżdżonego dla pętli. Drugi sposób jest lepszy, ale musiałem skorzystać z tej okazji:
for row in range(len(alist)): #A less Pythonic way to loop through lists
for col in range(len(alist[row])):
print(alist[row][col])
#[1, 2, 11]
#[3, 4]
#[5, 6, 7]
#[8, 9, 10]
#15
#[12, 13, 14]
Używanie plasterków na liście zagnieżdżonej:
print(alist[1][1:])
#[[8, 9, 10], 15, [12, 13, 14]]
#Slices still work
Ostateczna lista:
print(alist)
#[[[1, 2, 11], [3, 4]], [[5, 6, 7], [8, 9, 10], 15, [12, 13, 14]]]
Porównanie list
Możliwe jest porównywanie list i innych sekwencji leksykograficznie za pomocą operatorów porównania. Oba operandy muszą być tego samego typu.
[1, 10, 100] < [2, 10, 100]
# True, because 1 < 2
[1, 10, 100] < [1, 10, 100]
# False, because the lists are equal
[1, 10, 100] <= [1, 10, 100]
# True, because the lists are equal
[1, 10, 100] < [1, 10, 101]
# True, because 100 < 101
[1, 10, 100] < [0, 10, 100]
# False, because 0 < 1
Jeśli jedna z list znajduje się na początku drugiej, wygrywa najkrótsza lista.
[1, 10] < [1, 10, 100]
# True
Inicjowanie listy do stałej liczby elementów
W przypadku elementów niezmiennych (np. None
, literały łańcuchowe itp.):
my_list = [None] * 10
my_list = ['test'] * 10
W przypadku zmiennych elementów ta sama konstrukcja spowoduje, że wszystkie elementy listy będą odnosić się do tego samego obiektu, na przykład dla zestawu:
>>> my_list=[{1}] * 10
>>> print(my_list)
[{1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}]
>>> my_list[0].add(2)
>>> print(my_list)
[{1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}]
Zamiast tego, aby zainicjować listę za pomocą stałej liczby różnych zmiennych obiektów, użyj:
my_list=[{1} for _ in range(10)]