Sorting a list created from a parsed xml message

K

kaklis

Hi pythonistas,
From the subject of my message it's clear that i get an xml message
from a socket, i parse it and the result is a list like the one that
follows:
ID_Col
4 Server ak ip OFFLINE

29 Server and2 ip OFFLINE

5 Proxy l34e ip OFFLINE

6 Proxy barc ip ONLINE

41 Proxy proxy-2 ip ONLINE

53 Server server-4 ip ONLINE

52 Server server-3 ip ONLINE


What i want is to print this list sorted by ID_Col?
Any Suggestions?

Antonis K.
 
S

Stefan Behnel

(e-mail address removed), 21.07.2010 14:36:
From the subject of my message it's clear that i get an xml message
from a socket,

Not at all, but now that you say it...

i parse it and the result is a list like the one that
follows:
ID_Col
4 Server ak ip OFFLINE

29 Server and2 ip OFFLINE

5 Proxy l34e ip OFFLINE

6 Proxy barc ip ONLINE

41 Proxy proxy-2 ip ONLINE

53 Server server-4 ip ONLINE

52 Server server-3 ip ONLINE

Doesn't look like a Python list to me...

What i want is to print this list sorted by ID_Col?
Any Suggestions?

Assuming that the above is supposed to represent a list of tuples, you can
use the .sort() method on the list and pass operator.itemgetter(0) as 'key'
argument (see the sort() method and the operator module).

Stefan
 
K

kaklis

(e-mail address removed), 21.07.2010 14:36:


Not at all, but now that you say it...










Doesn't look like a Python list to me...


Assuming that the above is supposed to represent a list of tuples, you can
use the .sort() method on the list and pass operator.itemgetter(0) as 'key'
argument (see the sort() method and the operator module).

Stefan

No it is not a Python list at all. This the way i print the parsed
items 'like a list'.
But i want them to be sorted.
 
K

kaklis

No it is not a Python list at all. This the way i print the parsed
items 'like a list'.
But i want them to be sorted.

Well i did this:

SortedServers = []

for session in sessions:
for IP in session.getElementsByTagName("ipAddress"):
for iphn in session.getElementsByTagName("hostName"):
tempTuple = session.getAttribute("id"),
session.getAttribute("type"), iphn.childNodes[0].data,
IP.childNodes[0].data, session.getAttribute("status")

SortedServers.append(tempTuple)

Sorted = sorted(SortedServers, key=lambda id: SortedServers[0])
for item in Sorted:
print item

but the list is still unsorted and with u' in front of each item

(u'4', u'Server', u'aika74', u'ip', u'OFFLINE')
(u'29', u'Server', u'ando', u'ip2', u'OFFLINE')

How do i remove the u'

Antonis
 
S

Stefan Behnel

(e-mail address removed), 21.07.2010 15:38:
No it is not a Python list at all. This the way i print the parsed
items 'like a list'.
But i want them to be sorted.

Well i did this:

SortedServers = []

for session in sessions:
for IP in session.getElementsByTagName("ipAddress"):
for iphn in session.getElementsByTagName("hostName"):
tempTuple = session.getAttribute("id"),
session.getAttribute("type"), iphn.childNodes[0].data,
IP.childNodes[0].data, session.getAttribute("status")

SortedServers.append(tempTuple)

Sorted = sorted(SortedServers, key=lambda id: SortedServers[0])
for item in Sorted:
print item

but the list is still unsorted and with u' in front of each item

(u'4', u'Server', u'aika74', u'ip', u'OFFLINE')
(u'29', u'Server', u'ando', u'ip2', u'OFFLINE')

It seems you want to sort the list numerically. In that case, use
int(SortedServers[0]) as the key. Sorting by string values will sort the
list lexicographically.

How do i remove the u'

You should read the Python tutorial, specifically the sections about
strings. Then, read the sections on lists and sequences.

In short: Don't care about the "u'" prefix, that's just fine.

Stefan
 
T

Thomas Jollans

No it is not a Python list at all. This the way i print the parsed
items 'like a list'.
But i want them to be sorted.

Well i did this:

SortedServers = []

for session in sessions:
for IP in session.getElementsByTagName("ipAddress"):
for iphn in session.getElementsByTagName("hostName"):
tempTuple = session.getAttribute("id"),
session.getAttribute("type"), iphn.childNodes[0].data,
IP.childNodes[0].data, session.getAttribute("status")

Please try to persuade your mail client to not mess up python code, if
you could. It would make this *so* much easier to read
SortedServers.append(tempTuple)

Sorted = sorted(SortedServers, key=lambda id: SortedServers[0])

Anyway, let's look at that key function of yours:

key=lambda id: SortedServers[0]

translated to traditional function syntax:

def key(id):
return SortedServers[0]

No matter which item sorted() examines, the key it sorts by is always
the same (the first item of the WHOLE LIST).
You want something more like this:

def key(row):
return row[0]

ergo, what you want, all in all, is either of these:

Sorted = sorted(SortedServers, key=(lambda row: row[0])) # option 1
SortedServers.sort(key=(lambda row: row[0])) # option 2

option 2, the in-place sort, might be faster.

(and, as Stefan noted, as you probably want a numeric sort, you'll want
your key to be an int)
 
K

kaklis

Well i did this:
SortedServers = []
for session in sessions:
    for IP in session.getElementsByTagName("ipAddress"):
         for iphn in session.getElementsByTagName("hostName"):
              tempTuple = session.getAttribute("id"),
session.getAttribute("type"), iphn.childNodes[0].data,
IP.childNodes[0].data, session.getAttribute("status")

Please try to persuade your mail client to not mess up python code, if
you could. It would make this *so* much easier to read


              SortedServers.append(tempTuple)
Sorted = sorted(SortedServers, key=lambda id: SortedServers[0])

Anyway, let's look at that key function of yours:

key=lambda id: SortedServers[0]

translated to traditional function syntax:

def key(id):
    return SortedServers[0]

No matter which item sorted() examines, the key it sorts by is always
the same (the first item of the WHOLE LIST).
You want something more like this:

def key(row):
    return row[0]

ergo, what you want, all in all, is either of these:

Sorted = sorted(SortedServers, key=(lambda row: row[0])) # option 1
SortedServers.sort(key=(lambda row: row[0]))             # option 2

option 2, the in-place sort, might be faster.

(and, as Stefan noted, as you probably want a numeric sort, you'll want
your key to be an int)
for item in Sorted:
     print item
but the list is still unsorted and with u' in front of each item
(u'4', u'Server', u'aika74', u'ip', u'OFFLINE')
(u'29', u'Server', u'ando', u'ip2', u'OFFLINE')
How do i remove the u'

Thank you so much for your detailed response!

Antonis K.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,899
Latest member
RodneyMcAu

Latest Threads

Top