Вчера у меня была потребность в матричном типе в Python.
По-видимому, тривиальным ответом на эту потребность было бы использование numpy.matrix()
, но у меня есть еще одна проблема: я хотел бы, чтобы матрица хранила произвольные значения со смешанными типами, подобно списку. numpy.matrix
не выполняет этого. Примером является
>>> numpy.matrix([[1,2,3],[4,"5",6]])
matrix([['1', '2', '3'],
['4', '5', '6']],
dtype='|S4')
>>> numpy.matrix([[1,2,3],[4,5,6]])
matrix([[1, 2, 3],
[4, 5, 6]])
Как видите, numpy.matrix
должен быть однородным по содержанию. Если в моей инициализации присутствует строковое значение, каждое значение неявно сохраняется как строка. Это также подтверждается доступом к отдельным значениям
>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,1]
'5'
>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,2]
'6'
Теперь тип списка Python может принимать смешанные типы. Вы можете иметь список, содержащий целое число и строку, сохраняя их тип. То, что мне нужно, это что-то похожее на список, но работает как матрица.
Поэтому я должен был реализовать свой собственный тип. У меня было два варианта внутренней реализации: список, содержащий списки, и словари. Оба решения имеют недостатки:
- список списков требует тщательной синхронизации размеров различных списков. Поменять местами два ряда легко. Менять местами два столбца не так просто. Удаление строки также легко.
- словари (с кортежем в качестве ключа) немного лучше, но вы должны определить пределы вашего ключа (например, вы не можете вставить элемент 5,5, если ваша матрица 3x3), и они более сложны для используется для вставки, удаления или замены столбцов или строк.
Редактировать: уточнение. Конкретная причина, по которой мне нужна эта функциональность, заключается в том, что я читаю файлы CSV. После того, как я соберу значения из файла CSV (значения, которые могут быть строковыми, целыми числами, числами с плавающей запятой), я хотел бы выполнять подкачку, удаление, вставку и другие операции. По этой причине мне нужен «список матриц».
Мое любопытство:
- Знаете ли вы, если тип данных Python, обеспечивающий эту услугу, уже существует (может быть, в библиотеке "без батареи")?
- почему этот тип данных не предоставляется в стандартной библиотеке? Возможно, слишком ограниченный интерес?
- Как бы вы решили эту потребность? Словарь, список или другое разумное решение?