2013-09-30 3 views
0

У меня есть следующий набор данных:Заказать набор данных с серийными марками

import random 

def get_data(): 
    data = [] 
    for a in xrange(10): 
     serial_id = random.randint(0, 100) 
     node_data = 'data-%d' % (a) 
     data.append((serial_id, node_data)) 
    return data 

Что дает (ну, это случайно, так YMMV):

[(58, 'data-0'), (37, 'data-1'), (68, 'data-2'), (80, 'data-3'), (89, 'data-4'), (42, 'data-5'), (2, 'data-6'), (90, 'data-7'), (53, 'data-8'), (7, 'data-9')] 

Я хотел бы заказать это набор данных по serial_id, реализации:

def order_data(data): 
    ... 
    return ordered 

Где заказать бы:

[(2, 'data-6'), ... , (90, 'data-7')] 

Что было бы самым питоническим/эффективным способом для этого?

ответ

2

Использование sorted:

return sorted(data) 

или, если вы не заботитесь об изменении data, вы можете просто использовать .sort, чтобы сделать (немного более эффективным) в месте сортировать:

data.sort() 
return data 

Функция сравнения для кортежей упорядочивает их по их первому элементу, затем их второму элементу и т. Д.

+0

Чтобы объяснить: сортировка по умолчанию для кортежей - это сравнение каждого элемента кортежей по порядку. в этом случае сортировка по умолчанию сортируется по первому элементу кортежей, который является 'serial_id'. Если 'serial_id' равны, то он будет сравнивать на 'node_data'. – Claudiu

+0

Я вижу. Что делать, если экземпляры 'node_data' не сопоставимы? – dangonfast

+0

Затем вы можете использовать '.sort (key = lambda x: x [0])' (или 'key = operator.itemgetter (0)') для сортировки только для первого элемента. – nneonneo

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