Seznamy (seznam). Seznam funkcí a metod

Dnes budu mluvit o datovém typu jako seznamy, operace na nich a metody, o generátorech seznamů a použití seznamů.

Co jsou seznamy?

Seznamy v Pythonu jsou uspořádané proměnlivé kolekce objektů libovolné typy(téměř jako pole, ale typy se mohou lišit).

Chcete-li používat seznamy, musíte je vytvořit. Existuje několik způsobů, jak vytvořit seznam. Můžete například zpracovat jakýkoli iterovatelný objekt (například ) pomocí vestavěné funkce seznam:

>>> seznam ("seznam") ["seznam"]

Můžete také vytvořit seznam pomocí literálu:

>>> s = # Prázdný seznam >>> l = [ "s" , "p" , [ "isok" ], 2 ] >>> s >>> l ["s", "p", ["isok "], 2]

Jak je vidět z příkladu, seznam může obsahovat libovolný počet libovolných objektů (včetně vnořených seznamů) nebo obsahovat nic.

A další způsob, jak vytvořit seznam, je generátory seznamů. Generátor seznamu – způsob, jak stavět nový seznam, použití výrazu na každý prvek sekvence. Generátory seznamů jsou velmi podobné smyčce.

>>> c = [ c * 3 pro c v "seznamu" ] >>> c ["lll", "iii", "sss", "tttt"]

Je také možný složitější návrh generátoru seznamů:

>>> c = [ c * 3 pro c v "seznamu", pokud c != "i" ] >>> c ["lll", "sss", "ttt"] >>> c = [ c + d pro c v "seznamu", pokud c != "i" pro d v "spam", pokud d != "a" ] >>> c ["ls", "lp", "lm", "ss", "sp", "sm", "ts", "tp", "tm"]

Ale v těžké případy je lepší používat pravidelně pro smyčku generovat seznamy.

Seznam funkcí a metod

Vytvořte vytvořeno, nyní musíte se seznamem něco udělat. Pro seznamy jsou k dispozici základní a seznamové metody.

Tabulka "Seznam metod"

MetodaCo dělá
seznam.připojit(x)Přidá prvek na konec seznamu
seznam.prodloužit(L)Expanduje seznam seznamu, přidáním všech prvků seznamu L na konec
seznam.vložit(i, x)Vloží hodnotu x na i-tý prvek
seznam.odebrat(x)Odebere první prvek v seznamu, který má hodnotu x. ValueError, pokud žádný takový prvek neexistuje
seznam.pop([i])Odebere i-tý prvek a vrátí jej. Pokud index není zadán, bude odstraněn poslední prvek
seznam.index(x, ])Vrátí pozici prvního prvku s hodnotou x (hledání od začátku do konce)
seznam.počet(x)Vrátí počet prvků s hodnotou x
seznam.seřadit() Seřadí seznam na základě funkce
seznam.reverzní() Rozšiřuje seznam
seznam.kopírovat() Mělká kopie seznamu
seznam.jasný() Vymaže seznam

Je třeba poznamenat, že seznamové metody na rozdíl od , upravují samotný seznam, a proto není třeba do této proměnné zapisovat výsledek provedení.

>>> l = [ 1 , 2 , 3 , 5 , 7 ] >>> l . sort() >>> l >>> l = l . sort() >>> print(l) Žádný

A nakonec příklady práce se seznamy:

>>> a = [ 66,25 , 333 , 333 , 1 , 1234,5 ] >>> tisk ( a . počet ( 333 ), a . počet ( 66,25 ), a . počet ( "x" )) 2 1 0 >>> A. vložka (2 , - 1 ) >>> a . připojit (333) >>> a >>> a . index (333 ) 1 >>> a . odstranit (333) >>> a >>> a . obráceně() >>>a >>> a . sort() >>> a [-1, 1, 66.25, 333, 333, 1234.5]

Pro zvýšení produktivity jsou seznamy občas nahrazeny mnohem méně flexibilními

Abych odpověděl na tuto otázku, musím vysvětlit Unbounded Wildcards a Limited Wildcards.
Obsah tohoto příspěvku byl sestaven z java dokumentace.

1. Neomezené zástupné znaky

Neohraničený typ zástupného znaku je určen pomocí zástupného znaku (?), například Seznam. Říká se tomu seznam neznámý typ. Existují dva scénáře, ve kterých je neomezený zástupný znak užitečným přístupem:

    Pokud píšete metodu, kterou lze implementovat pomocí funkcí poskytovaných v Object.

    Když kód používá metody v obecné třídě, které nezávisí na parametru typu. Například List.size nebo List.clear . Ve skutečnosti Třídatak často používané, protože většina metod pochází z Class nezávisí na T.

2. Omezené zástupné znaky

Zvažte jednoduchou aplikaci pro kreslení, která dokáže kreslit tvary, jako jsou obdélníky a kruhy. Chcete-li tyto formuláře reprezentovat v programu, můžete definovat hierarchii tříd, například:

public abstract class Shape ( public abstract void draw(Canvas c); ) public class Circle extends Shape ( private int x, y, radius; public void draw(Canvas c) ( ... ) ) public class Rectangle extends Shape ( private int x, y, šířka, výška public void draw(Canvas c) ( ... ) )

Tyto třídy lze kreslit na plátno:

public class Canvas ( public void draw(Shape s) ( s.draw(this); ) )

Každý výkres obvykle obsahuje několik obrázků. Za předpokladu, že jsou reprezentovány jako seznam, bylo by vhodné mít v Canvas metodu, která je všechny vykreslí:

public void drawAll(Seznam tvary) ( for (Shape s: tvary) ( s.draw(this); ) )

Nyní pravidla typu říkají, že drawAll() lze volat pouze na seznamech přesně tvaru: nelze ji volat například na seznam . To je nešťastné, protože vše, co metoda dělá, je čtení tvarů ze Seznamu, takže ji lze stejně snadno volat na Seznam . Ve skutečnosti chceme, aby metoda akceptovala seznam libovolného tvaru: public void drawAll(list Forms) ( ... ) Je zde malý, ale velmi důležitý rozdíl: nahradili jsme typ List na Seznamu. Nyní drawAll() bude přijímat seznamy všech podtříd Shape, takže ji nyní můžeme volat, pokud chceme.

Seznam- příklad omezené šablony. ? znamená neznámý typ, avšak v tomto případě víme, že tento neznámý typ je ve skutečnosti podtypem tvaru. (Poznámka: může to být samotný tvar nebo nějaká podtřída; nemusí doslova rozšiřovat tvar.) Říkáme, že tvar je horní hranice zástupný znak.

Stejná syntaxe? super T , což je omezený zástupný znak, označuje neznámý typ, což je supertyp T. A ArrayedHeap280, například zahrnuje ArrayedHeap280 ArrayedHeap280 a ArrayedHeap280 . Jak můžete vidět v dokumentaci java pro třídu Integer, Integer je podtřídou třídy Number, která je zase podtřídou třídy Object.

Jednou z klíčových vlastností Pythonu, díky které je tak populární, je jeho jednoduchost. Obzvláště působivá je snadnost práce s různými datovými strukturami – seznamy, n-ticemi, slovníky a množinami. Dnes se podíváme na práce se seznamy.

Co je seznam v Pythonu?

Seznam je datová struktura pro ukládání objektů různých typů. Pokud jste používali jiné programovací jazyky, měli byste být obeznámeni s konceptem pole. Seznam je tedy velmi podobný poli, pouze, jak je uvedeno výše, může ukládat objekty různých typů. Velikost seznamu není statická, lze ji změnit. Seznam je svou povahou proměnlivý datový typ. O datových typech si můžete přečíst podrobně. Proměnná definovaná jako seznam obsahuje odkaz na strukturu v paměti, která zase ukládá odkazy na některé další objekty nebo struktury.

Jak se seznamy ukládají do paměti?

Jak bylo uvedeno výše, seznam je proměnlivý datový typ. Při jeho vytvoření je v paměti rezervována oblast, kterou lze zhruba nazvat „kontejner“, ve kterém jsou uloženy odkazy na další datové prvky v paměti. Na rozdíl od datových typů, jako je číslo nebo řetězec, lze obsah „kontejneru“ seznamu změnit. Chcete-li si tento proces lépe představit, podívejte se na obrázek níže. Nejprve byl po operaci vytvořen seznam obsahující odkazy na objekty 1 a 2 a = 3, druhý odkaz v seznamu nyní ukazuje na objekt 3.

Vytváření, změny, mazání seznamů a práce s jeho prvky

Seznam můžete vytvořit jedním z následujících způsobů.

> > > a = > > > typ (a)< class "list" >> > > b = seznam() > > > typ (b)< class "list" >

Můžete také vytvořit seznam s předdefinovanou sadou dat.

> > > a = > > > typ (a)< class "list" >

Pokud již máte seznam a chcete vytvořit jeho kopii, můžete použít následující metodu:

> > > a = > > > b = a[:] > > > tisknout (a) > > >

nebo to udělej takto:

> > > a = > > > b = seznam (a) > > > tisknout (a) > > > tisknout (b)

V případě, že provádíte jednoduché přiřazení seznamů k sobě, pak proměnná b bude přiřazen odkaz na stejný datový prvek v paměti, na který se odkazuje A, nikoli kopii seznamu A. Tito. pokud změníte seznam A, pak b se také změní.

> > > a = > > > b = a > > > tisknout (a) > > > tisknout (b) > > > a = 10 > > > tisknout (a) > > > tisknout (b)

Přidání prvku do seznamu se provádí pomocí metody append().

> > > a = > > > a.append(3 ) > > > a.append("ahoj" ) > > > tisknout (a)

Chcete-li odstranit prvek ze seznamu, pokud znáte jeho hodnotu, použijte metodu remove(x), která odstraní první odkaz na tento prvek.

> > > b = > > > tisknout (b) > > > b.odstranit(3 ) > > > tisknout (b)

Pokud potřebujete odstranit prvek podle jeho indexu, použijte příkaz del list_name[index].

> > > c = > > > tisknout (c) > > > del c > > > tisknout (c)

Hodnotu prvku seznamu můžete změnit, když znáte jeho index, přímým přístupem k němu.

> > > d = > > > tisknout (d) > > > d = 17 > > > tisknout (d)

Seznam můžete vymazat jednoduchou reinicializací, jako byste jej znovu vytvářeli.Chcete-li získat přístup k prvku seznamu, zadejte index prvku v hranatých závorkách.

>> > a = > > > a 7

Můžete použít záporné indexy, v takovém případě bude počítání začínat od konce, například pro přístup k poslednímu prvku seznamu můžete použít následující příkaz:

>> > a[- 1] 0

Chcete-li získat podseznam ze seznamu v určitém rozsahu indexů, zadejte počáteční a koncový index v hranatých závorkách oddělených dvojtečkou.

>> > a

Seznam metod

list.append(x)

Přidá prvek na konec seznamu. Stejnou operaci lze provést takto a = [x].

> > > a = > > > a.append(3 ) > > > tisknout (a)

list.extend(L)

Rozšiřuje existující seznam přidáním všech prvků ze seznamu L. Ekvivalent k příkazu a = L.

> > > a = > > > b = > > > a.extend(b) > > > tisknout (a)

list.insert(i, x)

Vložit prvek x do pozice i. První argument je index prvku, za který bude prvek vložen x.

> > > a = > > > a.insert(0 , 5 ) > > > print (a) > > > a.insert(len (a), 9 ) > > > print (a)

list.remove(x)

Odstraní první výskyt prvku x ze seznamu.

> > > a = > > > a.remove(1 ) > > > tisknout (a)

list.pop([i])

Odebere prvek z pozice i a vrátí to. Pokud použijete metodu bez argumentu, bude odstraněn poslední prvek ze seznamu.

> > > a = > > > tisknout (a.pop(2)) 3 > > > tisknout (a.pop()) 5 > > > tisknout (a)

list.clear()

Odebere všechny prvky ze seznamu. Ekvivalent od [:].

> > > a = > > > tisknout (a) > > > a.clear() > > > tisknout (a)

list.index(x[, začátek[, konec]])

Vrátí index prvku.

> > > a = > > > a.index(4) 3

list.count(x)

Vrátí počet výskytů prvku x do seznamu.

> > > a= > > > tisknout (a.count(2)) 2

list.sort(key=None, reverse=False)

Seřadí položky v seznamu ve vzestupném pořadí. Chcete-li seřadit v opačném pořadí, použijte příznak obráceně = pravda. Možnost otevírá další možnosti klíč, další podrobnosti naleznete v dokumentaci.

> > > a = > > > a.sort() > > > tisknout (a)

list.reverse()

Obrátí pořadí prvků v seznamu.

> > > a = > > > a.reverse() > > > tisknout (a)

list.copy()

Vrátí kopii seznamu. Ekvivalent A[:].

> > > a = > > > b = a.copy() > > > tisknout (a) > > > tisknout (b) > > > b = 8 > > > tisknout (a) > > > tisknout (b)

Seznam porozumění

Seznam porozumění Nejčastěji se do ruštiny překládá jako abstrakce seznamu nebo zahrnutí seznamu, je to součást syntaxe jazyka, která poskytuje jednoduchý způsob vytváření seznamů.Nejjednodušší způsob práce seznam porozumění ukázat na příkladu. Řekněme, že potřebujete vytvořit seznam celých čísel z 0 na n, Kde n přednastaveno. Klasický způsob řešení tohoto problému by vypadal takto:

N = int (vstup ()) a = pro i v rozsahu (n): a.append(i) tisk (a)

Používání seznam porozumění dělá to mnohem jednodušší:

N = int(vstup()) a = tisk(a)

nebo dokonce takto, v případě, že už nepotřebujete používat n:

A = tisk (a)

P.S.

Pokud vás téma analýzy dat zajímá, doporučujeme se s knihovnou seznámit pandy. Na našem webu najdete Všechny lekce knihovny pandy shromážděné v knize



 Nahoru