L oop через набор запросов и словарь с аналогичными ключами по порядку - PullRequest
0 голосов
/ 29 марта 2020

У меня есть django набор запросов, содержащий информацию о сетевых вещах. Первичный ключ - это IP. Затем у меня есть словарь с IP-адресами в качестве ключей, содержащий некоторые данные.

Я хотел бы отобразить все IP-адреса из любого из двух источников по порядку вместе с некоторой информацией.

Если IP-адрес существует в наборе запросов, меня не волнует значение словаря.

Например, с учетом:

<Queryset[{'ip':'10.2.2.2', 'type':'laptop', ...},
          {'ip':'10.4.4.4', 'type':'camera', ...},
          {'ip':'10.5.5.5', 'type':'iot',    ...},
          {'ip':'10.8.8.8', 'type':'switch', ...}]>

и:

{'10.1.1.1': 'foo', '10.4.4.4':'xxx', '10.6.6.6': 'bar', '10.9.9.9': 'baz'}

Я хочу следующее вывод:

10.1.1.1  foo
10.2.2.2  type: laptop ...
10.4.4.4  type: camera ...
10.5.5.5  type: iot ...
10.6.6.6  bar
10.8.8.8  type: switch ...
10.9.9.9  baz

Я мог бы делать вложенные циклы, но есть ли аккуратный способ pythoni c способ?

1 Ответ

1 голос
/ 29 марта 2020

Вы действительно не хотите вкладывать петли. Поскольку вам не важна запись dict, если она находится в наборе запросов, вы можете обновить dict с помощью элементов из набора запросов, и они будут перезаписаны. Затем вы можете отсортировать элементы dict одновременно.

d.update(qs.values_list('ip', 'type'))

for k, v in sorted(d.items()):
    print(k, v)

Где d - это диктат, а qs - набор запросов.

Если вам все еще нужен type: часть, распечатанная для элементов, изначально принадлежащих только к набору запросов, может сделать обновление немного по-другому.

d.update((k, 'type: '+v) for k, v in qs.values_list('ip', 'type'))

Это добавляет строку type: к каждому значению из набора запросов, прежде чем поместить его в dict. .

Это не просто type. Для каждого IP я хочу либо весь объект, либо строку из словаря

Что-то вроде этого, тогда?

d.update((o.ip, o) for o in qs)

Вы можете установить значение стороны пары в быть тем, что вы хотите в выражении генератора.

...