Создать словарь в цикле - PullRequest
0 голосов
/ 12 июня 2018

У меня есть 2 списка, которые я хочу преобразовать в dict с ключом и значениями.Мне удалось это сделать, но слишком много шагов, поэтому я хотел бы знать, есть ли более простой способ добиться этого.По сути, я хотел бы создать дикт непосредственно в цикле без лишних шагов ниже.Я только начал работать с Python, и я не совсем понимаю все типы данных, которые он предоставляет.При необходимости можно изменить форму jName.

jName=["Nose", "Neck", "RShoulder", "RElbow", "RWrist", "LShoulder", "LElbow", "LWrist", "RHip",
        "RKnee","RAnkle","LHip", "LKnee", "LAnkle", "REye", "LEye", "REar", "LEar"]
def get_joints(subset, candidate):
    joints_per_skeleton = [[] for i in range(len(subset))]
    # for each detected skeleton
    for n in range(len(subset)):
        # for each joint
        for i in range(18):
            cidx = subset[n][i]
            if cidx != -1:
                y = candidate[cidx.astype(int), 0]
                x = candidate[cidx.astype(int), 1]
                joints_per_skeleton[n].append((y, x))
            else:
                joints_per_skeleton[n].append(None)
    return joints_per_skeleton

joints = get_joints(subset,candidate)
print joints

Вот вывод списка соединений в списке

[[None, (48.0, 52.0), (72.0, 50.0), None, None, (24.0, 55.0), (5.0, 105.0), None, (63.0, 159.0), (57.0, 221.0), (55.0, 281.0), (28.0, 154.0), (23.0, 219.0), (23.0, 285.0), None, (25.0, 17.0), (55.0, 18.0), (30.0, 21.0)]]

Здесь я определил функцию для создания словаря из 2 списков.

def create_dict(keys, values):
    return dict(zip(keys, values))

my_dict = create_dict(jointsName, joints[0])

Вот результат:

{'LAnkle': (23.0, 285.0),
 'LEar': (30.0, 21.0),
 'LElbow': (5.0, 105.0),
 'LEye': (25.0, 17.0),
 'LHip': (28.0, 154.0),
 'LKnee': (23.0, 219.0),
 'LShoulder': (24.0, 55.0),
 'LWrist': None,
 'Neck': (48.0, 52.0),
 'Nose': None,
 'RAnkle': (55.0, 281.0),
 'REar': (55.0, 18.0),
 'RElbow': None,
 'REye': None,
 'RHip': (63.0, 159.0),
 'RKnee': (57.0, 221.0),
 'RShoulder': (72.0, 50.0),
 'RWrist': None}

1 Ответ

0 голосов
/ 13 июня 2018

Я думаю defaultdict может вам помочь.Я сделал свой собственный пример, чтобы показать, что вы можете предварительно определить ключи, а затем пройти двойной цикл for и получить значения dict списков потенциально разных размеров.Пожалуйста, дайте мне знать, если это ответит на ваш вопрос:

from collections import defaultdict
import random
joint_names = ['hip','knee','wrist']
num_skeletons = 10

d = defaultdict(list)

for skeleton in range(num_skeletons):
    for joint_name in joint_names:
        r1 = random.randint(0,10)
        r2 = random.randint(0,10)
        if r1 > 4:
            d[joint_name].append(r1*r2)

print d

Вывод:

defaultdict(<type 'list'>, {'hip': [0, 5, 30, 36, 56], 'knee': [35, 50, 10], 'wrist': [27, 5, 15, 64, 30]})

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

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