Как изменить именованный кортеж? - PullRequest
0 голосов
/ 23 января 2020

У меня есть список именованных кортежей. Я хочу изменить некоторые значения внутри, но, конечно, кортеж неизменен. Интересно, смогу ли я заменить весь кортеж, но сначала мне нужно понять его будущее, которого я не нашел в документации.

def _createRowClass(self):
    self.Row = namedtuple('Row', [str(c) for c in self._columns])
#_columns is a dict.

def addRow(self, *args, **kwargs):
    self._rows.append(self.Row(*args, **kwargs))

Пример элемента _rows:

Out[40]: Row(rlnCoordinateX='1951.892292', rlnCoordinateY='1482.277896', rlnHelicalTubeID='6', rlnAngleTiltPrior='90.000000', rlnAnglePsiPrior='-110.29072', rlnHelicalTrackLength='1264.598540', rlnAnglePsiFlipRatio='0.500000', rlnImageName='000243@Extract/job011/Movies/Microtubules_02563.mrcs', rlnMicrographName='MotionCorr/job003/Movies/Microtubules_02563.mrc', rlnMagnification='10000.000000', rlnDetectorPixelSize='5.480000', rlnCtfMaxResolution='5.830000', rlnCtfFigureOfMerit='0.124704', rlnVoltage='300.000000', rlnDefocusU='7457.819824', rlnDefocusV='6964.129883', rlnDefocusAngle='33.520000', rlnSphericalAberration='2.700000', rlnCtfBfactor='0.000000', rlnCtfScalefactor='1.000000', rlnPhaseShift='0.000000', rlnAmplitudeContrast='0.100000', rlnOriginX='0.000000', rlnOriginY='0.000000')

Когда я индексирую именованный кортеж, я получаю значение, но не ключ, так что это точно: rlnAmplitudeContrast = '0.100000' ?

Я думаю, может быть воссоздать этот именованный кортеж с теми изменениями, которые я хочу, например, заменить rlnVoltage на 200,000000 вместо 300,000000, а затем заменить этот именованный кортеж в списке новым мутированным? Как я могу это сделать?

Любые другие предложения и идеи приветствуются.

1 Ответ

0 голосов
/ 23 января 2020

Объекты типа, созданного namedtuple, имеют метод ._replace для удобного создания нового кортежа с обновленными полями (без изменения):

>>> from collections import namedtuple
>>> Record = namedtuple('Record', 'name age id')
>>> r = Record('Juan', '30', 1)
>>> r
Record(name='Juan', age='30', id=1)
>>> r._replace(name='Pablo')
Record(name='Pablo', age='30', id=1)
>>> r._replace(name='Jon', age='31')
Record(name='Jon', age='31', id=1)

Примечание, namedtuple объекты нарушают соглашение об одиночных подчеркиваниях для непубличных c частей API, _replace в этом случае является частью publi c API.

...