Tengo una lista de tuplas:

foo = [(1, 5), (1, 3), (1, 9), (2, 8), (2, 3), (3, 1)]

Estoy tratando de distribuir valores de foo en array de arrays, y el resultado debería verse así:

_result[0] = []
_result[1] = [5, 3, 9]
_result[2] = [8, 3]
_result[3] = [1]

Y este es mi código:

_result = [[]]

for x,y in foo:
   _result[x].append(y)

Pero estoy recibiendo un error:

IndexError: list index out of range

¿Cómo debo arreglarlo?

Editar:

  • El resultado no tiene que ser arreglado
  • La matriz en la posición cero debe contener un campo vacío.

El ejemplo es simple, pero foo también puede contener otros valores como:

foo = [(9, 5), (10, 3), (10, 9), (5, 8), (5, 3), (9, 1)]

Resultado:

_result[0] = []
_result[1] = []
_result[2] = []
_result[3] = []
_result[4] = []
_result[5] = [8, 3]
_result[6] = []
_result[7] = []
_result[8] = []
_result[9] = [5, 1]
_result[10] = [3, 9]

Por lo tanto, todos los valores que no están en la posición x deben contener an empty field en el índice dado

0
Alechandro 7 may. 2020 a las 16:46

2 respuestas

La mejor respuesta
foo = [(45, 5), (1, 3), (1, 9), (2, 8), (2, 3), (3, 1)]

length = 0

for x,y in foo:
    if x > length:
        length = x

_result = []

for i in range(length + 1):
    _result.append([])

for x,y in foo:
    _result[x].append(y)

Problemas en su código:

  • No puede acceder a una posición de índice en una lista donde no existe un elemento.

  • No puede agregar a una lista que no existe.

2
ben 7 may. 2020 a las 14:21

Puedes usar una dict aquí.

Ej:

foo = [(1, 5), (1, 3), (1, 9), (2, 8), (2, 3), (3, 1)]
result = {}
for k, v in foo:
    result.setdefault(k, []).append(v)

print(result) # -->{1: [5, 3, 9], 2: [8, 3], 3: [1]}

También puede usar collections.defaultdict en lugar de setdefault

3
Rakesh 7 may. 2020 a las 13:53