Intercambiar asientos

Escribe una solución para intercambiar los asientos de cada dos estudiantes consecutivos. Si el número de estudiantes es impar, el id del último estudiante no se intercambia. Regresa el resultado ordenado por id en orden ascendente.

#pandas#subqueries

Tabla: Seat

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| student     | varchar |
+-------------+---------+

- id es la llave primaria (valor único).
- Cada fila indica el nombre y el ID de un alumno.
- id es una columna auto incrementable.

El formato del resultado se muestra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Seat:
+----+---------+
| id | student |
+----+---------+
| 1  | Abbot   |
| 2  | Doris   |
| 3  | Emerson |
| 4  | Green   |
| 5  | Jeames  |
+----+---------+

Salida:

+----+---------+
| id | student |
+----+---------+
| 1  | Doris   |
| 2  | Abbot   |
| 3  | Green   |
| 4  | Emerson |
| 5  | Jeames  |
+----+---------+

Explicación:
- Nota que si el número de alumnos es impar, no hay necesitad de intercambiar el último alumno.

Solución:

import pandas as pd


def exchange_seats(seat: pd.DataFrame) -> pd.DataFrame:
    students = seat['student'].to_list()
    if len(students) == 0:
        return pd.DataFrame({'id': [], 'student': []})

    for i in range(0, len(students) - 1, 2):
        students[i], students[i + 1] = (students[i + 1],
                                        students[i])

    return pd.DataFrame({
        'id': range(1, seat.index.max() + 2),
        'student': students
    })


def test_exchange_seats():
    data = [
        [1, 'Abbot'],
        [2, 'Doris'],
        [3, 'Emerson'],
        [4, 'Green'],
        [5, 'Jeames']
    ]
    seat = pd.DataFrame(
        data, columns=['id', 'student']
    ).astype({'id':'Int64', 'student':'object'})

    data = [
        [1, 'Doris'],
        [2, 'Abbot'],
        [3, 'Green'],
        [4, 'Emerson'],
        [5, 'Jeames']
    ]
    expected = pd.DataFrame(
        data, columns=['id', 'student']
    ).astype({'id':'Int64', 'student':'object'})

    got = exchange_seats(seat)

    pd.testing.assert_frame_equal(
        got, expected, check_dtype=False)

slackmart blog © 2024