Я повторял этот ответ много раз, поэтому я надеюсь, что это последний раз
Ответ состоит из двух вещей:
1) Подготовка данных: я не знаюВаш набор данных, но я буду угадывать
2) Отображение данных
1) а) Подготовка данных
Я знаю об одном простом решениикоторый может решить все ваши проблемы с подготовкой данных.Но одно условие должно быть выполнено, и это то, что ваши ширины и длины являются целыми числами.Если это так, тогда решение легко: допустим, максимальная ширина равна 10, а максимальная длина тоже равна 10.
Вы создаете сетку размером 11x11 в виде numpy (потому что от 0 до 10 - это 11 ячеек)
# chararray because you can initialize
# grid with being empty (empty string fields)
grid=np.chararray(shape=[11,11])
for part in part_list:
grid[part.width,part.length] = str(part.part_number)
#If you have 2 parts with same parameter you can sum up string so its flexible
Таким образом, вы можете использовать индексы массива в качестве фактической ширины и длины параметров
1) б) Подготовка данных
ваша проблемакак-то застрял в моей голове, пока я не нашел общее решение вашей проблемы (хотя я до сих пор не знаю ваш набор данных). На основе приведенного выше примера , если ваши параметры в любой форме (int, float, string), вы можете сделать это
# Lets say you have 3 types of widths and lengths and you index them
# Key is your parameter, value is index position in grid
widths = {'7.2mm':0,'9.6mm':1,'11.4mm':2}
lengths = {'2.2mm':0,'4.8mm':1,'16.8mm':2}
header = [h for h in widths] # useless in this example
side = [s for s in lengths ] # but can serve for Data display part
grid=np.chararray(shape=[3,3])
for part in part_list:
index_width = widths[part.width]
index_lentgh = lengths[part.length]
grid[index_width ,index_lentgh] = str(part.part_number)
# This way, you dont need to care about missing part numbers and grid can stay unfilled
2) Отображение данных
from prettytable import PrettyTable
def table(header,side,data):
t = PrettyTable(['']+header)
for i in range(len(data)):
t.add_row([side[i]]+list(data[i]))
print(t)
header = ['col1','col2','col3']
side = ['row1','row2','row3']
data = np.zeros(shape=[3,3])
>> table(header,side,data)
+------+------+------+------+
| | col1 | col2 | col3 |
+------+------+------+------+
| row1 | 0.0 | 0.0 | 0.0 |
| row2 | 0.0 | 0.0 | 0.0 |
| row3 | 0.0 | 0.0 | 0.0 |
+------+------+------+------+
Вы можете кормить его чем угодно (например, классами)
data2 = [['','',PrettyTable],['World','',5],['','Hello','']]
table(header,side,data)
>>> table(header,side,data2)
+------+-------+-------+-----------------------------------+
| | col1 | col2 | col3 |
+------+-------+-------+-----------------------------------+
| row1 | | | <class 'prettytable.PrettyTable'> |
| row2 | World | | 5 |
| row3 | | Hello | |
+------+-------+-------+-----------------------------------+
РЕДАКТИРОВАТЬ: На основе данных выборки я смог сделать то, что требовалось:
import numpy as np
widths = {'#10-24':0, '#10-32':1, '1/4-20':2, '5/16-18':3, '3/8-16':4, '1/2-13':5, '5/8-11':6, '3/4-10':7} # My data dictionary looks like
lenghts = {'5/8':0,'3/4':1,'7/8':2}
part_list = [{'part_number': 'FTC19-62', 'width': '#10-24', 'length': '5/8'},
{'part_number': 'FTC19-75', 'width': '#10-32', 'length': '3/4'},
{'part_number': 'FTC19-87', 'width': '#10-24', 'length': '7/8'}]
grid=np.chararray(shape=[len(lenghts),len(widths)]).astype('|S8')
grid[:,:] = ''
for part in part_list:
index_width = widths[part['width']]
index_lentgh = lenghts[part['length']]
grid[index_lentgh,index_width] = str(part['part_number'])
header = sorted(widths, key=lambda k: widths[k])
side = sorted(lenghts, key=lambda k: lenghts[k])
from prettytable import PrettyTable
def table(header,side,data):
t = PrettyTable(['']+header)
for i in range(len(data)):
t.add_row([side[i]]+list(data[i]))
print(t)
table(header,side,grid)
+-----+----------+----------+--------+---------+--------+--------+--------+--------+
| | #10-24 | #10-32 | 1/4-20 | 5/16-18 | 3/8-16 | 1/2-13 | 5/8-11 | 3/4-10 |
+-----+----------+----------+--------+---------+--------+--------+--------+--------+
| 5/8 | FTC19-62 | | | | | | | |
| 3/4 | | FTC19-75 | | | | | | |
| 7/8 | FTC19-87 | | | | | | | |
+-----+----------+----------+--------+---------+--------+--------+--------+--------+
>>>