Lista compreensão vs compreensão dicionário

votos
-1

Boa tarde pessoal,

Eu tenho o seguinte código que modifica valores de dicionário 'no lugar'

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

Minha pergunta é: pode um objetivo semelhante ser alcançado com compreensão da lista? Quero que todos os valores que estar em ordem na mesma lista.

desde já, obrigado

Publicado 27/11/2018 em 18:01
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Eu ia escrever a sua função assim:

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

Isso não é materialmente diferente do que a resposta de Patrick Artner que não seja a forma da mapperfunção como um dicionário de tuplas.

Par de outros comentários:

  1. A forma di={k:f(v) for k,v in di.items()}é não fazendo alterações colocam di. Em vez disso a compreensão dict é primeiro criar um novo dict anónimo e, em seguida, atribui esse dict ao nome diquando ele é feito. A questão principal (talvez) é que os requisitos de memória para fazer isso são mais, pelo menos 2x do que na atribuição lugar.
  2. A única forma de update 'in-place', com uma compreensão é:
    1. Use uma atribuição fatia li[:]=[list comprehension]ou
    2. Use .updatecom uma compreensão dictdi.update({dict comprehension on a subset of di})
  3. Não há vantagem de usar uma compreensão de lista em detrimento de uma compreensão dict para criar um dicionário.
  4. Dict de só têm qualquer 'ordem' em Python 3.6+. Eles usam ordem de inserção neste caso.
Respondeu 27/11/2018 em 19:12
fonte usuário

votos
1

Lista de Compensações há cura-tudo, o que você precisa é de uma pesquisa para reduzir a iteração todos os itens () 5 vezes até 1 hora:

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

Está faltando alguns valores - Espero que isso é intencional.

Respondeu 27/11/2018 em 18:09
fonte usuário

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