Биективная функция между двумя вложенными списками (Python) - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу определить функцию в Python, чтобы установить биекцию между двумя вложенными списками.Два списка a и b, и я хочу сопоставить a[i][j] с b[i][j].

Однако я не могу этого сделать.Я попытался использовать цикл while, а также цикл for для перебора индексов элементов списков, но безрезультатно.

Я новичок в Python, поэтому любая помощь в этом будетпризнателен.

Вот код, который я пытался.У меня есть следующие два списка, lastcoldata и firstcoldata (представленные ниже), и я хочу провести вышеупомянутую биекцию между ними.

lastcoldata=[[4], [0, 5, 6], [3], [], [], [], [], [], [], [], [], [], [], [], [1, 2], [], [], [], [], [], [], [], [], [], [], [], []]

firstcoldata=[[0], [1, 2, 3], [4], [], [], [], [], [], [], [], [], [], [], [], [5, 6], [], [], [], [], [], [], [], [], [], [], [], []]

def bijection(num):
    i=0;j=0
    while i<27:
        while j<len(lastcoldata[i]):
            if num==lastcoldata[i][j]:
                return firstcoldata[i][j]
            j=j+1
        i=i+1

Например, я попытался позвонить bijection(lastcoldata[1][0]) ине было никакого выхода, в то время как ожидаемый результат был 1.Он работал нормально для bijection(lastcoldata[1][1]) и bijection(lastcoldata[1][2]) соответственно, давая выходные данные 2 и 3 соответственно.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Другое решение, которое избегает индексов и является более питоническим:

def bijection(num):
    for li, fi in zip(lastcoldata, firstcoldata):
        for lj, fj in zip(li, fi):
            if lj == num:
                return fj
    return None

Если параметр не найден, он возвращает None.

Кстати, он также быстрее:

%timeit bijection(2)
3.32 µs ± 37 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

против

4.11 µs ± 27.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

первого решения, указанного выше @ Marmik

0 голосов
/ 11 декабря 2018

Ваша единственная ошибка в том, что вы не сбрасываете значение j.Он продолжает увеличиваться, и после точки он никогда не войдет во второй цикл

Для Loop Solution

def bijection(num) :
    for i in range(len(lastcoldata)) :
        for j in range(len(lastcoldata[i])) :
            if num == lastcoldata[i][j] :
                return firstcoldata[i][j]
    return None

В то время как Loop Solution

def bijection(num):
    i=0;
    while i < 27:
        j=0;
        while j < len(lastcoldata[i]):
            if num == lastcoldata[i][j]:
                return firstcoldata[i][j]
            j=j+1
        i=i+1
...