Kuinka muuntaa sarja luetteloksi Pythonissa

Mitä se on

Sarjan muuntaminen luetteloon tarkoittaa järjestämättömän kokoelman muuttamista yksilöllisistä, hajautettavissa olevista elementeistä tilattavaksi, indeksoitavaksi sekvenssiksi. Käytännössä otat sarjan ja luot luettelon, joka sisältää samat elementit.

Miksi sillä on merkitystä

Sarjat ovat ihanteellisia nopeaan jäsenkokeeseen ja kaksoiskappaleiden poistamiseen, mutta ne eivät tue indeksointia tai viipalointia. Luettelot tekevät. Muuntaminen antaa sinun:

  • Hakemisto, viipaloi tai järjestä elementit uudelleen
  • Lajittele kohteet tai sarjoita ne tietyssä järjestyksessä
  • Välittää tietoja sovellusliittymille, jotka vaativat luetteloita

Kuinka käyttää sitä

Menetelmä 1: Käytä luetteloa () rakentajaa (suorin)

Sisäänrakennettulist()rakentaja hyväksyy kaikki iterable - mukaan lukien sarjat ja jäädytetyt - ja palauttaa uuden luettelon.

# Set to list
s = {1, 2, 3, 4}
lst = list(s)
print(lst)     # e.g., [1, 2, 3, 4] (order is arbitrary)

Menetelmä 2: Pakkaus [*iterable] (tiivis)

Päätälöity pakkaaminen muuttaa minkä tahansa iterablen elementteiksi uuden luettelon kirjaimellisessa luettelossa. Tämä yleinen pakkaus on määritelty PEP 448: ssa.

s = {1, 2, 3, 4}
lst = [*s]
print(lst)     # e.g., [3, 1, 4, 2]

Menetelmä 3: Tuota lajiteltu luettelo

Jos tarvitset ennustettavan tilauksen, käytäsorted()Palauttaa luettelo lajiteltuna luonnollisen järjestyksen mukaan. Elementtien on oltava molemminpuolisesti vertailukelpoisia.

Suositeltu lukeminen:Kirjoita luettelon ymmärrys Pythonissa

s = {10, 2, 7, 3}
lst = sorted(s)
print(lst)     # [2, 3, 7, 10]

Menetelmä 4: silmukka ja liite (nimenomainen hallinta)

Verbose, mutta hyödyllinen, jos haluat muuttaa elementtejä muuntamisen aikana.

s = {1, 2, 3, 4}
lst = []
for x in s:
    lst.append(x * 10)    # example transformation
print(lst)

Menetelmä 5: Frozensetistä

Frozenset ovat muuttumattomia sarjoja; Muutos on identtinenlist(). Katso Frozenset.

fs = frozenset({1, 2, 3})
lst = list(fs)
print(lst)

Rajat ja kompromissit

  • Tilaus: Sarjat ovat järjestämättömiä. Sarjasta saamasi luettelo on mielivaltainen iteraatiojärjestys. Käyttääsorted(s)Jos tarvitset deterministisen järjestyksen.
  • Vertailukelpoisuus:sorted(s)Vaatii kaikkien elementtien olevan vertailukelpoisia; sekoitettuja tyyppejä kuten{1, "a"}nostaa aTypeErrorlajiteltuna.
  • Suorituskyky: Muutos on lineaarinen elementtien lukumäärässä, O (n) kaikille suoraviivaisille menetelmille (rakennus, purkaminen, silmukka).
  • Hiipivuus: Vain hajautettavat esineet voivat elää sarjassa. Jos joudut sisällyttämään esteettömät kohteet (kuten luettelot), sinun on muunnettava ne (esim. Tupleiksi) ennen kuin ne voivat olla sarjassa.

Faqit

Säilyttääkö Set → luettelo alkuperäisen tilauksen?
Ei. Sarjoissa ei ole taattua järjestystä. Jos tarvitset tietyn tilauksen, käytäsorted(s)tai soveltaa omaa avaintoimintoasorted(s, key=...).

Näin ”TypeError: 'Set' -objektia ei voida kutsua." Mitä tapahtui?
Olet todennäköisesti kirjoittanut sisäänrakennetun nimensetMuuttujan kanssa yritti sitten kutsua sitä. Käynnistä tuore kuori tai poista muuttuja ja vältä muuttujien nimeämistäsettailist.

set = {1, 2}     # bad: shadows the built-in
set([3, 4])      # TypeError

Mikä on nopein tapa?
Tavallista muuntamista varten,list(s)ja[*s]ovat sekä ytimekkäitä että O (n). Valitse yksi, jonka tiimisi on eniten luettavissa.

Kuinka voin poistaa kaksoiskappaleet luettelosta ja pitää ensimmäisen näkemän tilauksen?
Yleinen malli on dedulaatio tilatulla näppäinelokuvalla, kääntää sitten takaisin luetteloon:

data = ["a", "b", "a", "c", "b"]
unique_preserving_order = list(dict.fromkeys(data))  # Python 3.7+
print(unique_preserving_order)  # ['a', 'b', 'c']

Luokkamenetelmä on dokumentoitu kohdassadict.fromkeys.

Voinko muuntaa ja lajitella samanaikaisesti?
Kyllä:sorted(s)Palauttaa luettelon, joten et tarvitse ylimääräistä rakentajaa.

Pikaviite

# Basic conversion
lst = list(s)

# Unpack into a list literal
lst = [*s]

# Sorted list
lst = sorted(s)

# Frozenset to list
lst = list(fs)

# Transform while converting
lst = [func(x) for x in s]

Related Posts