Преобразование словаря в список списков - PullRequest
0 голосов
/ 08 марта 2020

Допустим, я получил словарь, определенный следующим образом: d ={(0, 1): 1, (1, 0): 4, (1, 3): 7, (2, 3): 11} Я хочу преобразовать его в список таким образом, чтобы каждый ключ представлял этот индекс значения во вложенном списке и индекс самого вложенного списка в списке. , Каждый вложенный список имеет 4 элемента , индексы без заданных значений установлены на 0 .

Я отстой при описании. Вот что я хочу, чтобы моя функция возвращала: lst = [[0,1,0,0], [4,0,0,7], [0,0,0,11]]. Вот мой незаконченный, нерабочий код:

def convert):
lst = []
for i in range(len(d)):
    lst += [[0,0,0,0]] # adding the zeros first.
for i in d:
    for j in range(4):
        lst[j] = list(i[j]) # and then the others.

Ответы [ 4 ]

1 голос
/ 08 марта 2020
# Input
example_d = {(0, 1): 1, (1, 0): 4, (1, 3): 7, (2, 3): 11}

def get_list(d):
    # Figure out the required lengths by looking at the highest indices
    max_list_idx = max(x for (x, _), _ in d.items())
    max_sublist_idx = max(y for (_, y), _ in d.items())

    # Create an empty list with the max sizes
    t = [[0] * (max_sublist_idx + 1) for _ in range(max_list_idx + 1)]

    # Fill out the empty list according to the input
    for (x, y), value in d.items():
        t[x][y] = value

    return t

print(get_list(example_d))
# Output: [[0, 1, 0, 0], [4, 0, 0, 7], [0, 0, 0, 11]]
1 голос
/ 08 марта 2020

Как насчет:

for (x,y), value in d.items():
    list[x][y] = value

Вот вся функция, которая также автоматически создает правильный размер списка

def convert(d):
    # Figure out how big x and y can get
    max_x = max([coord[0] for coord in d.keys()])
    max_y = max([coord[1] for coord in d.keys()])

    # Create a 2D array with the given dimensions 
    list = [[0] * (max_y + 1) for ix in range(max_x + 1)]

    # Assign values
    for (x,y), value in d.items():
        list[x][y] = value

    return list

if __name__ == "__main__":
    d ={(0, 1): 1, (1, 0): 4, (1, 3): 7, (2, 3): 11}
    print(convert(d))
0 голосов
/ 08 марта 2020

Вы можете использовать понимание списка:

d ={(0, 1): 1, (1, 0): 4, (1, 3): 7, (2, 3): 11}
m_x, m_y = map(max, zip(*d))
m = [[d.get((b, a), 0) for a in range(m_y+1)] for b in range(m_x+1)]

Выход:

[[0, 1, 0, 0], [4, 0, 0, 7], [0, 0, 0, 11]]
0 голосов
/ 08 марта 2020

Вы можете попробовать это.

max_x=max(d,key=lambda x:x[0])[0] # For finding max number of rows
# 2
max_y=max(d,key=lambda x:x[1])[1] # For finding max of columns
# 3
new_list=[[0]*(max_y+1) for _ in range(max_x+1)] # Creating a list with max_x+1 rows and max_y+1 columns filled with zeros
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

for (x,y),v in d:
    new_list[x][y]=v
new_list
# [[0, 1, 0, 0], [4, 0, 0, 7], [0, 0, 0, 11]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...