Lista rozumienie vs słowniku zrozumieniem

głosy
-1

Dobry wieczór ludzie,

Mam następujący kod, który modyfikuje wartości słownik „w miejscu”

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 pytanie brzmi, może podobny cel można osiągnąć z listy ze zrozumieniem? Chcę wszystkich wartości, aby być w porządku w tej samej liście.

Z góry dziękuję

Utwórz 27/11/2018 o 18:01
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

Chciałbym napisać funkcję 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()}

Że nie jest w istotny sposób różni się od odpowiedzi Patricka artner w innym niż postaci mapperfunkcji jako dict krotek.

Kilka innych uwag:

  1. Formularz di={k:f(v) for k,v in di.items()}jest nie robi się miejsce na aktualizacje di. Zamiast rozumienie dict jest najpierw stworzenie nowego anonimowy dict a następnie przypisuje ten dict do nazwy di, gdy jest ona wykonywana. Głównym problemem (chyba) jest to, że wymagania dotyczące pamięci dla robią, że są co najmniej 2x więcej niż w przypisania miejsce.
  2. Jedyną formą „na miejscu” aktualizacji ze zrozumieniem jest:
    1. Wykorzystywać przydział plaster li[:]=[list comprehension]lub
    2. Korzystać .updateze zrozumieniem dictdi.update({dict comprehension on a subset of di})
  3. Nie ma zaletą korzystania z wyrażeń listowych w preferencji do zrozumienia dict aby utworzyć dict.
  4. DICT mają tylko żadnego „porządku” na Python 3.6+. Używają kolejność wstawiania w tym przypadku.
Odpowiedział 27/11/2018 o 19:12
źródło użytkownik

głosy
1

Lista comps ma lekarstwa wszystko, czego potrzebujemy, to wyszukiwanie zmniejszenie iteracji (-e) 5 razy w dół do 1 raz:

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()} 

Brakuje niektórych wartości - Mam nadzieję, że to miód zamierzone.

Odpowiedział 27/11/2018 o 18:09
źródło użytkownik

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