2016-08-17 3 views
1

Я пытаюсь сортировать список следующим образом.сортировка списка кортежей на основе инженерного блока

data = [('18.3G', 'pgaur'), ('29.6G', 'adsoni'), ('5.51G', 'keyur'), ('10.8G', 'adityac')] 

sorted(data, key= lambda x:x[0]) 

но не сортировка данные.

+0

Как вы хотите отсортировать данные? Это ключ или по стоимости? – d3r1ck

+1

сортирует данные, но буквенно-цифровыми, поскольку они являются строками, а не цифрами. Также вы не сохраняете полученный список в любом месте. –

+0

'sorted (data, key = lambda x: x [1])' сортирует данные по значению в алфавитном порядке. – d3r1ck

ответ

2

Для сортировки чисел в том, что имеет смысл для людей, вы должны убедиться, что они представлены в виде чисел, а не в виде текста:

  • например, «5» является строка, представляющая число, не число так example_list = ['5', '10'], если отсортировано даст `['10', '5'] , потому что для сравнения '5' против '1'; по одному персонажу за раз.

Чтобы получить результат, который вы, вероятно, хотите, вы должны сделать следующее:

data = [('18.3G', 'pgaur'), ('29.6G', 'adsoni'), ('5.51G', 'keyur'), ('10.8G', 'adityac')] 

sorted_list = sorted(data, key=lambda x: float(x[0][:-1])) 
print(sorted_list) 
# prints [('5.51G', 'keyur'), ('10.8G', 'adityac'), ('18.3G', 'pgaur'), ('29.6G', 'adsoni')] 

Обратите внимание на разрезание на x[0]. Он принимает все символы в x[0] отдельно от последнего ('G'), так как это испортит сортировку числа. Затем нарезанный x[0] преобразуется в float с float() и используется для сортировки. Наконец, результаты сохраняются в новом списке.

1
sorted(data, key= lambda x:float(x[0][:][:-1])) 

Дает вам то, что вы хотите.

Это сортировка по первому элементу кортежа х [0] [:] копирует остальной кортеж, [: -1] до последней цифры (за исключением G)

1

В идеале вам нужно ключевая функция, которая возвращает числовое значение. Предположим, что вы можете использовать k, m и g как множители. Этот код не проверяет ошибки, который, как обычно, оставлен в качестве упражнения для читателя.

def sortkey(pair): 
    num = pair[0][:-1] 
    mult = pair[0][-1].lower() 
    num = float(num) 
    mult = {'k': 1000, 'm': 1000000, 'g': 1000000000}[mult] 
    return num*mult 
+0

Я предположил, что «G» означает ускорение силы тяжести, а не «Гига», но интересно. –

+0

Если он постоянный, то решение @ ev., Вероятно, будет быстрее – holdenweb

Смежные вопросы