rings - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: General (https://python-forum.io/forum-1.html) +--- Forum: News and Discussions (https://python-forum.io/forum-31.html) +--- Thread: rings (/thread-30318.html) Pages:
1
2
|
rings - Skaperen - Oct-15-2020 i was thinking about the concept of a new container type. this is not for any particular need i have so i have no need to implement this. the name "ring" seems to make sense. maybe someone has a better name. a ring is very much like a list. does anyone think this might have some uses. it seems to me like practice implementing a container. a ring is a list with the end connected back to its own beginning. indexing is modulo the len() of the ring. a ring of 8 items can be indexed at [90] and access the very same position as [2] or [-6]. as in a list, index [-1] is the last item in a ring. a ring can be empty. trying to index an empty ring raises IndexError. indexing beyond the size of the ring indexes % len(ring) ring.pop(pos) removes and returns one item from the ring, making the ring smaller by one. pop defaults to -1. ring.insert(item,pos) inserts item where it comes to be after position pos making the ring one larger. pos defaults to -1 which inserts between the last and first like append() for a list. ring.insertbefore(item,pos) might be implemented. ring.rotateforward(count) shifts items forward in the right with items in the end (at [-1]) moving into the beginning (at [0]). this is repeated count times. a negative count rotates in reverse. ring.reverse() flips a ring over, so to speak. all items will now be in reverse order. ring() creates an new empty ring. ring(ring) creates a duplicate ring with the same items and references. ring(list/tuple) creates a ring with all items and references in the same order. ring(a,b,c,d) is like ring((a,b,c,d)) to create a ring with one container do ring((container)) or do ring([container]). a ring used as an iterator starts at position 0 and never ends. RE: rings - Gribouillis - Oct-15-2020 I would use a list and an integer as the underlying data, so that ring[k] is ring.list[(k + ring.shift) % len(ring.list)] .How would you slice a ring? RE: rings - buran - Oct-15-2020 Have you seen collections.deque? RE: rings - ndc85430 - Oct-16-2020 Sounds like a ring buffer to me. RE: rings - Skaperen - Oct-16-2020 it is inspired by a ring buffer. i made the fastest ring buffer in C (never copies data). RE: rings - metulburr - Oct-17-2020 I use this concept all the time in pygame for flipping through animation frames. I just do the norm of checking for end of the list and set index to 0 after the end. But it is usually static as the animations dont change mid way. But I would use a ring if it exists just to get rid of the code to reset the index RE: rings - Gribouillis - Oct-17-2020 There are several ring buffers or circular buffers in Pypi, some of them for numpy, some as C extensions, probably some in pure python, but they all seem to be for character strings. I haven't seen a true circular list. RE: rings - buran - Oct-17-2020 from collections import deque foo = deque([1,2,3], maxlen=3) print(foo) foo.rotate(5) print(foo) foo.append(4) print(foo)
RE: rings - Gribouillis - Oct-17-2020 @buran If you want fast random access, a linked list such as a deque looks suboptimal. Of course, we would need some benchmarks to decide. RE: rings - buran - Oct-17-2020 for random access it may be sub-optimal, but as the docs state Quote:Deques are a generalization of stacks and queues (the name is pronounced “deck” and is short for “double-ended queue”). Deques support thread-safe, memory efficient appends and pops from either side of the deque with approximately the same O(1) performance in either direction.I may misunderstand your point though |