Seznam porozumění vs slovníku chápání

hlasů
-1

Dobrý večer lidé,

Mám následující kód, který upravuje hodnoty ze slovníku ‚na místě‘

translate1 = {k:(0 if v > 300 and v < 900 else v) for k, v in translate1.items()}
translate1 = {k:(1 if v > 1400 and v < 2100 else v) for k, v in translate1.items()}
translate1 = {k:(2 if v > 8700 and v < 9100 else v) for k, v in translate1.items()}
translate1 = {k:(3 if v > 3800 and v < 4100 else v) for k, v in translate1.items()}
translate1 = {k:(4 if v > 6400 and v < 7000 else v) for k, v in translate1.items()}

Moje otázka zní, může být podobný cíl dosáhnout pomocí seznamu porozuměním? Chci všechny hodnoty být v pořádku ve stejném seznamu.

Díky předem

Položena 27/11/2018 v 18:01
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Chtěl bych napsat svůj funkci jako tak:

def mapper(v):
    di={
        (300,900):      0,
        (1400,2100):    1,
        (8700,9100):    2,
        (3800,4100):    3,
        (6400,7000):    4
    }
    for (t0,t1),ret in di.items():
        if t0<v<t1: return ret 
    return v

translate1={k:mapper(v) for k,v in translate1.items()}

To není podstatně odlišný od Patricka Artner své odpovědi kromě podobě mapperfunkci jako dict z n-tic.

Pár dalších komentářů:

  1. Formulář di={k:f(v) for k,v in di.items()}je to dělá v místě aktuální informace o di. Místo toho dict pochopení je nejprve vytvoří nový anonymní dict a potom přiřadí tuto dict na jméno di, když se to dělá. Hlavní problém (snad) je to, že požadavky na paměť pro to, že jsou nejméně 2x více než v místě přidělení.
  2. Jedinou formou ‚in-place‘ aktualizaci s porozuměním je buď:
    1. Použijte přiřazení řezů li[:]=[list comprehension]nebo
    2. Použijte .updates dict porozuměnímdi.update({dict comprehension on a subset of di})
  3. Neexistuje žádná výhoda použití seznamu porozumění v preferenci k dict porozumění k vytvoření dict.
  4. Dict je jen žádný ‚pořádek‘ na Python 3.6 a vyšší. Používají vložení objednávky v tomto případě.
Odpovězeno 27/11/2018 v 19:12
zdroj uživatelem

hlasů
1

Seznam comps žádný všelék, co potřebujete, je vyhledávací snížit iterace všechny položky () 5 krát až 1 čas:

def mapper(v):
    if 300 < v < 900:   # syntactical equivalent to v > 300 and v < 900
        return 0
    if 1400 < v < 2100:
        return 1
    if 8700 < v < 9100:
        return 2
    if 3800 < v < 4100:
        return 3
    if 6400 < v < 7000:
        return 4
    return v


translate1 = {k:mapper(v) for k, v in translate1.items()} 

Vám chybí některé hodnoty - doufám thats úmyslné.

Odpovězeno 27/11/2018 v 18:09
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more