def threshold(the_list,thresholding_value,upper_val,lower_value):
    ret_list=list(the_list)
    for each_item in ret_list:
        if each_item <= thresholding_value:
            each_item=lower_value
        else:
            each_item=upper_val
    return ret_list

temp=[-1,2,5,3,-1,5,32,-6]
ttt=r.threshold(temp,0,1,0)

Después de la exención sigo obteniendo el valor de la misma lista

2
Shaleen Jain 10 dic. 2015 a las 08:41

3 respuestas

La mejor respuesta

Las listas no son inmutables, pero cuando realiza un bucle sobre una, la variable de control de bucle obtiene una copia de cada elemento; no es un alias para eso. Por lo tanto, cambiarlo no afecta la lista.

Una forma más pitónica de hacer esto sería una comprensión de la lista que devuelve la nueva lista:

def threshold(the_list, threshold, upper, lower):
  return [lower if item <= threshold else upper for item in the_list]

threshold([-1,2,5,3,-1,5,32,-6],0,1,0)
# => [0, 1, 1, 1, 0, 1, 1, 0]
1
Mark Reed 10 dic. 2015 a las 05:57

Las listas son definitivamente mutables. Lo que sucede es que iteras sobre la lista, con cada elemento copiado a each_item a su vez. Lo que le sucede a cada elemento no es relevante para la lista, ya que es solo una variable temporal para mantener su valor, no un puntero.

Representar cada elemento como una lista de 1 elemento o una clase solucionaría su problema, pero el enfoque completo no es cómo se hace generalmente en python: por qué crear una copia de la lista cuando puede crear una lista vacía para el valor de retorno y agregar elementos como ¿anda tu?

0
Muposat 10 dic. 2015 a las 05:57

Each_item es solo una variable local que tiene su valor reemplazado con el operador =. Asignarle un valor no afectará la lista original. En su lugar, puede crear una nueva lista y completarla antes de devolverla:

def threshold(the_list, thresholding_value, upper_val, lower_val):
    ret_list = list()
    for each_item in the_list:
        if each_item <= thresholding_value:
            ret_list.append(lower_val)
        else:
            ret_list.append(upper_val)
    return ret_list

También podría acortar significativamente este código mediante el uso de comprensiones de listas:

def threshold(the_list, thresholding_value, upper_val, lower_val):
    return [lower_val if x <= thresholding_value else upper_val for x in the_list]
1
Mureinik 10 dic. 2015 a las 05:48
34194530