Сортировка столбцов, содержащих показатели в python - PullRequest
0 голосов
/ 10 декабря 2011

Я создал mylist, который читает:

[('GCK', '3e-12'), ('ist', '6e-30'), ('iso', '5e-15'), ('tig', '5e-77')]

, когда я запускаю функцию сортировки:

mylist.sort(key=operator.itemgetter(1))

это сортирует список по 2-му столбцу, но только по1-е целое число

[('GCKDGN101ANI4S', '3e-12'), ('isotig13037', '5e-15'), ('isotig14607', '5e-77'), ('isotig03156', '6e-30')]

Как мне его отсортировать по целому числу во 2-м столбце так, чтобы порядок был:

[('GCK', '3e-12'), ('ist', '5e-15'), ('tig', '6e-30'), ('iso', '5e-77')]

Ответы [ 4 ]

4 голосов
/ 10 декабря 2011

'3e-12' это не число, это строка. Строки отсортированы по каждой букве.

Вы хотите отсортировать числа, чтобы сначала их преобразовать. Либо в исходных данных:

old = [('GCK', '3e-12'), ('ist', '6e-30'), ('iso', '5e-15'), ('tig', '5e-77')]
new = [(name, float(x)) for name,x in old]
new.sort(key=operator.itemgetter(1))

или преобразовать предметы во время сортировки:

old.sort(key=lambda elem: float(elem[1]))
1 голос
/ 10 декабря 2011

Вы можете сначала преобразовать строки в числа.

import operator

a = [('GCKDGN101ANI4S', '3e-12'), ('isotig13037', '5e-15'), ('isotig14607', '5e-77'), ('isotig03156', '6e-30')]
converted_a = [ (row[0],float(row[1])) for row in a ]
converted_a.sort(key=operator.itemgetter(1), reverse=True)

print converted_a
1 голос
/ 10 декабря 2011

Вам просто нужно добавить конвертацию с плавающей точкой:

>>> mylist.sort(key=lambda x:float(x[1]), reverse=True)
>>> mylist
[('GCK', '3e-12'), ('iso', '5e-15'), ('ist', '6e-30'), ('tig', '5e-77')]
1 голос
/ 10 декабря 2011
>>> l = [('GCK', '3e-12'), ('ist', '6e-30'), ('iso', '5e-15'), ('tig', '5e-77')]
>>> sorted(l, key=lambda x: float(x[1]), reverse=True)
[('GCK', '3e-12'), ('iso', '5e-15'), ('ist', '6e-30'), ('tig', '5e-77')]
...