Создание мультидикта со случайными числами

У меня есть структура данных, определенная следующим образом:

reqList[i] = [multidict({
    1: ['type1', randint(1, 5), randint(1, 5), randint(1, 5)],
    2: ['type2', randint(1, 5), randint(1, 5), randint(1, 5)],
    3: ['type3', randint(1, 5), randint(1, 5), randint(1, 5)],
    4: ['type4', randint(1, 5), randint(1, 5), randint(1, 5)]
}),
    multidict({
        (1, 2): randint(500, 1000),
        (2, 3): randint(500, 1000),
        (3, 4): randint(500, 1000)
    })]

Я хочу сделать создание этой структуры данных автоматически в цикле, например. Я сделал это:

nodes = {}
for j in range(1, randint(2, 5)):
    nodes[j] = ['type%d' % j, randint(1, 5), randint(1, 5), randint(1, 5)]

edges = {}
for kk in range(1, len(nodes)):
    edges[(kk, kk + 1)] = randint(500, 1000)

print "EDGES", edges
reqList[i] = [multidict(nodes),
              multidict(edges)]

del (nodes, edges)

когда я смотрю в выдвинутые края, порядок ключей не сохраняется! Например, я получаю это:

EDGES {(1, 2): 583, (3, 4): 504, (2, 3): 993}

Я хочу, чтобы это было:

EDGES {(1, 2): 583, (2, 3): 993, (3, 4): 504}

Является ли способ, которым я кодирую это правильно? если нет, не могли бы вы предложить лучший способ, зная, что мне нужно получить тот же результат, что и в первом примере?

1 ответ

Словарь в 2.7 является неупорядоченным, и вы не можете сохранить порядок вставки, если только вы вручную не сохраните ссылку на то, какой ключ был вставлен и когда в отдельном списке. Модуль collections содержит класс под названием OrderedDict он действует как словарь, но сохраняет вставки в порядке, что вы могли бы использовать (он также использует список для отслеживания вставки ключей, но использует список двойных ссылок для ускорения удаления ключей).

Там нет другого пути, кроме этих двух методов.

from collections import OrderedDict

nodes = {}
for j in range(1, randint(2, 5)):
    nodes[j] = ['type%d' % j, randint(1, 5), randint(1, 5), randint(1, 5)]

edges = OrderedDict()
for kk in range(1, len(nodes)):
    edges[(kk, kk + 1)] = randint(500, 1000)

print "EDGES", edges # EDGES OrderedDict([((1, 2), 898), ((2, 3), 814)])

print edges[(1,2)] # still yields the correct number

Вы можете прочитать больше о OrderedDict Вот

Другие вопросы по тегам