Este es un ejemplo de una posible lista con las sublistas:

  rows = [[1, 1, 'x'], [1, 'x', 1], [1, 1, 'x'], [1, 'x', 1], ['x', 1, 1], ['x', 1, 1]]

Estoy buscando una forma eficiente de reemplazar 'x' por 0 o 1 en las sublistas. Las sublistas no tienen un tamaño o número fijo. Quiero decir, podría ser una lista como esta:

    [(1, 1, 'x', 'x'), (1, 1, 'x', 'x'), (1, 'x', 1, 'x'), (1, 'x', 'x', 1)]

Intenté esto:

  for row in rows:
      for pos in row:
        if pos == 'x':
           pos.replace('x','0')

Incluso sabiendo que necesito '0' como número entero, solo para imprimir una salida. Pero las filas mantuvieron la 'x' sin cambios.

¿Alguna sugerencia?

0
powerPixie 8 oct. 2019 a las 15:42

4 respuestas

La mejor respuesta

Podrías usar una comprensión list y verificar el valor y reemplazarlo como,

>> rows = [[1, 1, 'x'], [1, 'x', 1], [1, 1, 'x'], [1, 'x', 1], ['x', 1, 1], ['x', 1, 1]]
>>> [[0 if y == 'x' else y  for y in x] for x in rows] # replace `x` with 0
[[1, 1, 0], [1, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 1], [0, 1, 1]]

>>> another = [(1, 1, 'x', 'x'), (1, 1, 'x', 'x'), (1, 'x', 1, 'x'), (1, 'x', 'x', 1)]
>>> [[5 if y == 'x' else y  for y in x] for x in another] # replace `x` with 5
[[1, 1, 5, 5], [1, 1, 5, 5], [1, 5, 1, 5], [1, 5, 5, 1]]
2
han solo 8 oct. 2019 a las 12:45

Pruebe este código:

rows = [[1, 1, 'x'], [1, 'x', 1], [1, 1, 'x'], [1, 'x', 1], ['x', 1, 1], ['x', 1, 1]]

temp_dic = {'x':0}
modified_list  = map(
  lambda sub_list: sub_list if 'x' not in sub_list else [temp_dic.get(n, n) for n in sub_list],
  rows)
print(list(modified_list))

Salida:

[[1, 1, 0], [1, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 1], [0, 1, 1]]

Básicamente, estamos iterando a través de la sublista y verificando si hay un valor (0) para la clave (x). En caso afirmativo, reemplácelo, de lo contrario, mantenga la llave.

dic.get(n, n) devuelve el valor (0) si existe o simplemente devuelve la clave (por ejemplo, números en nuestro caso). De esta manera solo reemplazamos la 'x', no los números.

1
Amit Yadav 8 oct. 2019 a las 14:42

Si aún desea utilizar el método de reemplazo, deberá agregar los valores a una nueva lista después de reemplazar la cadena:

rows=[(1, 1, 'x', 'x'), (1, 1, 'x', 'x'), (1, 'x', 1, 'x'), (1, 'x', 'x', 1)]

new_list=[]
for row in rows:
    sublist=[]
    for pos in row:
        if pos == 'x':
            pos=pos.replace('x','0')
        sublist.append(pos)
    new_list.append(sublist)

print(new_list)
# [[1, 1, '0', '0'], [1, 1, '0', '0'], [1, '0', 1, '0'], [1, '0', '0', 1]]
0
jgredecka 8 oct. 2019 a las 13:27
rows = [[1, 1, 'x'], [1, 'x', 1], [1, 1, 'x'], [1, 'x', 1], ['x', 1, 1], ['x', 1, 1]]

for r in rows:
    for i, pos in enumerate(r):
        if pos == 'x':
            r[i] = 0
print(rows)

#output replace x with 0: [[1, 1, 0], [1, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 1], [0, 1, 1]]
#output replace x with 99: [[1, 1, 99], [1, 99, 1], [1, 1, 99], [1, 99, 1], [99, 1, 1], [99, 1, 1]]

Esto funciona bien para mí en Python 3.7.4. Saludos y buena suerte!

1
Teku1998 8 oct. 2019 a las 13:07
58286597