"indexed properties"...
David C. Ullrich
dullrich at sprynet.com
Thu May 22 07:26:41 EDT 2008
On Wed, 21 May 2008 12:47:44 +0200, pataphor <pataphor at gmail.com>
wrote:
>On Tue, 20 May 2008 10:40:17 -0500
>"David C. Ullrich" <dullrich at sprynet.com> wrote:
>
>> > > Today's little joke: Long ago I would have solved
>> > > this by storing the data as a list of rows and _also_
>> > > a list of columns, updating each one any time the
>> > > other changed. Just goes to show you things
>> > > could always be worse...
>> >
>> > Well have I ever ... I only thought about this last week and I
>> > actually thought it was a *good* idea.
>>
>> Sorry. If you really want to do this you could keep things
>> in sync automatically by writing the appropriate __setitem__
>> and resolving never to modify the data except through that...
>>
>> def whatever.__setitem__(self, (row,col), value):
>> self.rows[row][col] = value
>> self.cols[col][row] = value
>
>Using the trick of encapsulating the values inside single-element lists
>one can make a transposition of the matrix and get synchronicity for
>the little price of doubling the number of instances. Since the views
>share the data this is a lot less expensive than one would think. One
>can use the row view or the column view to alter data and the changes
>will automatically be visible in the other view, since the views update
>the same lists.
Oh - that's different. This is not what I thought you had in mind
(it's not what I had in mind in the thing I called a joke.)
>There is a little notational gotcha, instead of writing
>row[0] = [1,2,3] one now must write row[0][:] = [1,2,3] or else
>synchronicity is lost.
>
>I found a nice ListMixin class at
>http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440656
>
>Using that I wrote the following proof of concept:
>
>class Storage(ListMixin):
>
> def __init__(self, seq=[]):
> self.L = [[x] for x in seq]
>
> def _constructor(self, iterable):
> return Storage(iterable)
Probably I'm just being dense. Why does
_constructor exist? (Oh - looking at things
below, I imagine it's something to do with
ListMixin.)
> def __len__(self):
> return len(self.L)
>
> def _get_element(self, i):
> assert 0 <= i < len(self)
> return self.L[i][0]
>
> def _set_element(self, i, x):
> assert 0 <= i < len(self)
> self.L[i][0] = x
>
> def _resize_region(self, start, end, new_size):
> assert 0 <= start <= len(self)
> assert 0 <= end <= len(self)
> assert start <= end
> self.L[start:end] = [[None] for i in range(new_size)]
>
>def test():
> n = 3
> R = range(n)
> it = iter(range(n*n))
> MR = [Storage(it.next() for i in R) for i in R]
> MC = [Storage() for i in R]
> T = zip(*[x.L for x in MR])
> for x,y in zip(MC,T):
> x.L = y
> print MR
> print MC
> MC[2][:] = 'abc'
> print
> print MR
> print MC
>
>if __name__=='__main__':
> test()
>
>Output:
>
>[Storage([0, 1, 2]), Storage([3, 4, 5]), Storage([6, 7, 8])]
>[Storage([0, 3, 6]), Storage([1, 4, 7]), Storage([2, 5, 8])]
>
>[Storage([0, 1, 'a']), Storage([3, 4, 'b']), Storage([6, 7, 'c'])]
>[Storage([0, 3, 6]), Storage([1, 4, 7]), Storage(['a', 'b', 'c'])]
>
>P.
David C. Ullrich
More information about the Python-list
mailing list