#python #arrays #dictionary #matrix
#питон #массивы #словарь #матрица
Вопрос:
Мне нужно построить матрицу с некоторыми значениями, которые у меня есть, но в качестве кортежа, где у меня есть словарь, где значения являются координаторами, а ключи-это просто идентификатор, мне нужно построить матрицу 5X6 и добавить значения в мой код примерно так:
DIC = {1: (0.0, 0.0), 6: (0.0, 0.14), 2: (0.14, 0.0), 7: (0.14, 0.14), 3: (0.28, 0.0), 8: (0.28, 0.14), 4: (0.42, 0.0), 9: (0.42, 0.14), 5: (0.56, 0.0), 10: (0.56, 0.14), 11: (0.0, 0.28), 12: (0.14, 0.28), 13: (0.28, 0.28), 14: (0.42, 0.28), 15: (0.56, 0.28), 16: (0.0, 0.42), 17: (0.14, 0.42), 18: (0.28, 0.42), 19: (0.42, 0.42), 20: (0.56, 0.42), 21: (0.0, 0.56), 22: (0.14, 0.56), 23: (0.28, 0.56), 24: (0.42, 0.56), 25: (0.56, 0.56), 26: (0.0, 0.7), 27: (0.14, 0.7), 28: (0.28, 0.7), 29: (0.42, 0.7), 30: (0.56, 0.71)} w, h = 5, 6 position = [[(tuple(DIC[element]) for element in DIC) for x in range(w)] for y in range(h)] print(position)
к сожалению, я получаю это при запуске кода
at 0x7fccc7ff37b0gt;, lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff3820gt;, lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff3890gt;], [lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff3900gt;, lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff3970gt;, lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff39e0gt;, lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff3a50gt;, lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff3ac0gt;], [lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff3b30gt;, lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff3ba0gt;, lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff3c10gt;, lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff3c80gt;, lt;generator object lt;listcompgt;.lt;listcompgt;.lt;genexprgt; at 0x7fccc7ff3cf0gt;]]
У кого-нибудь есть идеи, как получить ценности???
Комментарии:
1. Вопрос неясен: как следует использовать значения в диктанте?
Ответ №1:
Основываясь на ограниченном описании, я сделал предположение, что вы хотите использовать индекс своего словаря в качестве индексов для своей матрицы. Если это так, то, похоже, в вашем словаре нет индекса 0, поэтому в приведенном ниже списке понимания вы захотите начать свои диапазоны с 1.
position = [ [ DIC[x*y] for x in range(1, w 1) ] for y in range(1, h 1) ] position [[(0.0, 0.0), (0.14, 0.0), (0.28, 0.0), (0.42, 0.0), (0.56, 0.0)], [(0.14, 0.0), (0.42, 0.0), (0.0, 0.14), (0.28, 0.14), (0.56, 0.14)], [(0.28, 0.0), (0.0, 0.14), (0.42, 0.14), (0.14, 0.28), (0.56, 0.28)], [(0.42, 0.0), (0.28, 0.14), (0.14, 0.28), (0.0, 0.42), (0.56, 0.42)], [(0.56, 0.0), (0.56, 0.14), (0.56, 0.28), (0.56, 0.42), (0.56, 0.56)], [(0.0, 0.14), (0.14, 0.28), (0.28, 0.42), (0.42, 0.56), (0.56, 0.71)]]
Комментарии:
1. Поздравляю вас с вашими первоклассными способностями к чтению мыслей!!
2. thnx, но он не выполняет ту работу, которую я хочу, чтобы он выполнял 🙁 я также был бы доволен 2 матрицами x и y с координатором x и y из dic
Ответ №2:
( x для x в …) понимается как генератор.
нет необходимости в явном кортеже (), потому что ваши данные уже являются кортежем
[[DIC[element] for element in DIC for x in range(w)] for y in range(h)]
Это делает свою работу
Комментарии:
1. На самом деле это не совсем то, что я хочу, в моем дикте 30 элементов, и мне просто нужна матрица с 30 элементами, не более
2. Поэтому я думаю, что вопрос не ясен, вы ищете матрицу 5x6x2 ?
Ответ №3:
Ошибка, которую вы получаете, вызвана использованием скобок вместо скобок во внутреннем понимании:
(tuple(DIC[element]) for element in DIC)
является итератором.
[tuple(DIC[element]) for element in DIC]
это список.
Обратите внимание, что получение ключей для повторного доступа к словарю не требуется. Так же как и приведение значений к кортежам (они уже являются кортежами). list(DIC.values())
приведет к тому же результату, что и понимание приведенного выше списка.
Кроме того, неясно, чего вы пытаетесь достичь. Похоже, у вас есть словарь кортежей с ключами, соответствующими позициям на основе одного в матрице 5×6. ЕСЛИ это так, вы могли бы получить желаемый результат следующим образом:
position = [[DIC[r c 1] for c in range(w)] for r in range(0,w*h,w) ] print(position) [[(0.0, 0.0), (0.14, 0.0), (0.28, 0.0), (0.42, 0.0), (0.56, 0.0)], [(0.0, 0.14), (0.14, 0.14), (0.28, 0.14), (0.42, 0.14), (0.56, 0.14)], [(0.0, 0.28), (0.14, 0.28), (0.28, 0.28), (0.42, 0.28), (0.56, 0.28)], [(0.0, 0.42), (0.14, 0.42), (0.28, 0.42), (0.42, 0.42), (0.56, 0.42)], [(0.0, 0.56), (0.14, 0.56), (0.28, 0.56), (0.42, 0.56), (0.56, 0.56)], [(0.0, 0.7), (0.14, 0.7), (0.28, 0.7), (0.42, 0.7), (0.56, 0.71)]]
Если ключи в словаре не основаны на координатах и вы хотите, чтобы значения присваивались только последовательно, вы можете использовать итератор для DIC.values():
iDIC = iter(DIC.values()) position = [[next(iDIC) for _ in range(w)] for _ in range(h) ]
Это дает тот же результат, но не зависит от какой-либо связи между ключами и позициями (это зависит только от порядка в словаре).