Richard Rublev Richard Rublev - 7 months ago 20
Python Question

How do I sort list of numerical value dictionaries?

I have two files with 6000 numerical values.I am giving just first 15 values of both.

base.txt
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03
2.900000e+03


new2.txt

0
100
200
1
101
201
2
102
202
3
103
203
4
104
204


I want to create a new list from the base.txt values(velocities) that would correspond to ascending order of second file.(0,1,2,3,4,5,..)
My code so far

import itertools
from operator import itemgetter

vel = [line.strip() for line in open("base.txt", 'r')]
ind = [line.strip() for line in open("new2.txt", 'r')]

print type(vel)
print type(ind)

adict = dict(itertools.izip(ind,vel))

newlist = sorted(adict, key=itemgetter(ind))


My idea was to read files as lists,create dictionary and then try to sort out the values,but this code is not working.
I got this

<type 'list'>
<type 'list'>
Traceback (most recent call last):
File "m1.py", line 11, in <module>
newlist = sorted(adict, key=itemgetter(ind))
TypeError: string indices must be integers, not list


The files are here
http://pastebin.com/he1RuSnv

http://pastebin.com/VfXZB4W3

When I try solution of CPanda,I got

2.900000e+03 0
2.900000e+03 1
2.900000e+03 10
2.900000e+03 100
2.900000e+03 1000
2.900000e+03 1001
2.900000e+03 1002
2.900000e+03 1003
2.900000e+03 1004
2.900000e+03 1005
2.900000e+03 1006
2.900000e+03 1007
2.900000e+03 1008
2.900000e+03 1009
2.900000e+03 101
2.900000e+03 1010
2.900000e+03 1011
2.900000e+03 1012


This is not what I want,Iwant second index to go 0,1,2,3,4,5 and so on...

Answer

To solve the error, your last line, the one with sorted should be

newlist = [el[1] for el in sorted(adict.items())]

Sorted returns a list of key value tuples from the dict.

Then with the list comprehension you extract the ordered values into your newlist

You can also merge the last two lines into one:

newlist = [el[1] for el in sorted(itertools.izip(ind,vel))]