On Thu, Jan 15, 2009 at 6:48 AM, spir <denis.s...@free.fr> wrote: > I have a list of tuples element, in which the first item is a kind of key. I > need a target list > with only one tuple per key. But the order must be kept -- so that I cannot > use a temp dictionary. > Additionally, in this case the chosen element for a repeted key is the last > one occurring in > source list. > > How would you do that?
In [1]: items = [(1,'a'),(1,'b'),(2,'a'),(3,'a'),(3,'b'),(4,'a'),(5,'a'),(5,'b'),(5,'c')] In [2]: seen = set() In [3]: newItems = [] In [5]: for item in reversed(items): ...: if item[0] not in seen: ...: seen.add(item[0]) ...: newItems.append(item) In [6]: newItems Out[6]: [(5, 'c'), (4, 'a'), (3, 'b'), (2, 'a'), (1, 'b')] In [7]: newItems.reverse() In [8]: newItems Out[8]: [(1, 'b'), (2, 'a'), (3, 'b'), (4, 'a'), (5, 'c')] Or, with a somewhat hacky list comp: In [9]: seen = set() In [10]: [ item for item in reversed(items) if item[0] not in seen and not seen.add(item[0]) ] > Also, how to practically walk in reverse order in a list without copying it > (e.g. items[::-1]), > especially if i need both indexes and items (couldn't find with enumerate()). See use of reversed() above. You can combine it with enumerate(): In [13]: list(enumerate(reversed(items))) Out[13]: [(0, (5, 'c')), (1, (5, 'b')), (2, (5, 'a')), (3, (4, 'a')), (4, (3, 'b')), (5, (3, 'a')), (6, (2, 'a')), (7, (1, 'b')), (8, (1, 'a'))] In [16]: list(reversed(list(enumerate(items)))) Out[16]: [(8, (5, 'c')), (7, (5, 'b')), (6, (5, 'a')), (5, (4, 'a')), (4, (3, 'b')), (3, (3, 'a')), (2, (2, 'a')), (1, (1, 'b')), (0, (1, 'a'))] Kent _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor