[2.5.1.1/dictionary] Change sorting order?

Jean-Michel Pichavant jeanmichel at sequans.com
Fri Jan 22 11:02:45 EST 2010


Gilles Ganault wrote:
> On Fri, 22 Jan 2010 14:09:43 +0100, Jean-Michel Pichavant
> <jeanmichel at sequans.com> wrote:
>   
>> Sorry, the code I provided produce this output:
>>
>> ['1a', 'a', 'ac', 'av', 'b', 'c']
>> ['a', 'ac', 'av', 'b', 'c', '1a']
>> ['b', 'c', '1a', 'a', 'ac', 'av']
>> ['c', '1a', 'a', 'ac', 'av', 'b']
>> ['1a', 'a', 'ac', 'av', 'b', 'c']
>>
>> which is actually what you are searching for. I just messed up with my 
>> ipython shell history :o)
>>     
>
> Thanks for the help. I'm a Python newbie, and have a difficult time
> understanding what the [] + [] line does :-/
>
> I'll simplify things by using a list instead of a dictionary:
>
> ============
> connected = []
> connected.append("0test")
> connected.append("aa")
> connected.append("bb")
> connected.append("cc")
>
> for start in '1abcd':
>     result = [name for name in connected if name[0] >= start] + [name
> for name in connected if name[0] < start]
>     print result
> ============
> C:\>test.py
> ['aa', 'bb', 'cc', '0test']
> ['aa', 'bb', 'cc', '0test']
> ['bb', 'cc', '0test', 'aa']
> ['cc', '0test', 'aa', 'bb']
> ['0test', 'aa', 'bb', 'cc']
> ============
>
> Pretty close to what I need to do but..
>
> 1. Why is the first iteration done twice?
>
> 2. How can I have just one line, save the character that I used as
> starting point, increment it, and save it into a file so it can be
> read the next time this program runs? For instance, let's say we used
> "b" to start looking for items, I'll save "c" in a file for the next
> time.
>
> Thank you.
>   

1/ [] + [] is using 2 python lists comprehension, Google it for details. 
It is quite difficult to read until you become familiar with it. Once 
you get it, you can write magical stuff :o)
Basically, list comrehension allows to map functions to list elements 
and / or filter those elements.

So what I'm using is the filter feature of list comprehension:
[list of names for which the first char is greater that 'start'] + [list 
of names for which the first char is less than 'start']

2/ Are you sure you want to do that ? looks like you are using a hammer 
to smash a fly. As someone has suggested before, maybe you want to 
pickup some starting index random.

connected = ['aa', 'bb', 'cc', '0test']

import random

def getNewOrder(myList):
	index = random.randint(0,len(myList)-1)
	print index
	return myList[index:] + myList[:index] # using slicing instead of list comprehension (suggested by DaveA)

print getNewOrder(connected)

JM





More information about the Python-list mailing list