python - ожидаемый dict, полученный список ошибок - PullRequest
0 голосов
/ 28 мая 2018

В приведенной ниже функции есть словарь под названием task_ranku{}.

Я пытаюсь отсортировать по его значениям и распечатать словарь.

Однако, когда я добавляю эти 2 строки для сортировки и печати, я получаю сообщение об ошибке Expected dict, got list

Может кто-нибудь объяснить, что я делаю неправильно?

cdef dict task_ranku_sorted = sorted(task_ranku.values())

  for key, value in task_ranku_sorted.iteritems():
      print key, value



def heft_order(object nxgraph, PlatformModel platform_model):

  """
  Order task according to HEFT ranku.

  Args:
    nxgraph: full task graph as networkx.DiGraph
    platform_model: cscheduling.PlatformModel instance

  Returns:
    a list of tasks in a HEFT order
  """

  cdef double mean_speed = platform_model.mean_speed
  cdef double mean_bandwidth = platform_model.mean_bandwidth
  cdef double mean_latency = platform_model.mean_latency

  cdef dict task_ranku = {}

  for idx, task in enumerate(list(reversed(list(networkx.topological_sort(nxgraph))))):

    ecomt_and_rank = [
      task_ranku[child] + (edge["weight"] / mean_bandwidth + mean_latency)
      for child, edge in nxgraph[task].items()
    ] or [0]

    task_ranku[task] = task.amount / mean_speed + max(ecomt_and_rank) + 1

  # use node name as an additional sort condition to deal with zero-weight tasks (e.g. root)
  return sorted(nxgraph.nodes(), key=lambda node: (task_ranku[node], node.name), reverse=True)

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

cdef dict task_ranku_sorted = sorted(task_ranku.values()) Это даст отсортированный список значений, так что task_ranku_sorted - это список отсортированных значений.

, и при этом ваша используемая функция iteritems(). Эта функция разрешена или применима только для или применимадля dict переменная типа не для list, и вы используете ее для list, то есть task_ranku_sorted.iteritems(), поэтому вы получаете эту ошибку.

Если вы хотите отсортировать словарь, см. следующие функции:

import operator
sorted_dictinory = sorted(dictinory.items(), key=operator.itemgetter(1))

ИЛИ

sorted_dictinory = sorted(dictinory.items(), key=lambda x: x[1])

ИЛИ

from collections import OrderedDict
sorted_dictinory = OrderedDict(sorted(dictinory.items(), key=lambda x: x[1]))
0 голосов
/ 28 мая 2018

Task_ranku_sorted не является диктонарным, это список:

task_ranku_sorted = sorted(task_ranku.values())

при вызове values ​​() в исходном словаре и сортировке только списка значений.

Вы можете проверить это:

print type(task_ranku_sorted)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...