list of tuples with dynamic change in position

Peter Otten __peter__ at web.de
Tue Sep 7 03:16:30 EDT 2010


sajuptpm wrote:

> More details
> I have a list of tuples l = [((cpu_util,mem_util),(disk_util)),
> ((cpu_util,mem_util),(disk_util))]
> ie, l = [((30,50),(70)), ((50,20),(20))]
> 
> l.sort(key=lambda x:(-x[0][0], x[1][0])) # sorting cpu_util asc and
> disk_util desc
> 
> suppose i changed order that is l = [((mem_util,cpu_util),
> (disk_util)), ((mem_util,cpu_util),(disk_util))]
> So i have to change the sort code to l.sort(key=lambda x:(-x[0][1],
> x[1][0])) # sorting cpu_util asc and disk_util desc
> 
> 
> I want to use same (common) sort code, that must work even if i
> changed tuple order.

Use namedtuples:

from collections import namedtuple

Pair = namedtuple("Pair", "pair disk_util")
A = namedtuple("A", "cpu_util mem_util")
B = namedtuple("B", "mem_util cpu_util")

# you can safely omit this step
for class_ in A, B, Pair:
    del class_.__repr__

items = [((30,50), 70), ((50,20),20)]

a = [Pair(A(x, y), z) for (x, y), z in items]
b = [Pair(B(y, x), z) for (x, y), z in items]

def sort(items):
    items.sort(key=lambda x: x.pair.mem_util, reverse=True)
    items.sort(key=lambda x: x.pair.cpu_util)

sort(a)
print a

sort(b)
print b

Peter



More information about the Python-list mailing list