2010-12-12 2 views
1

я задавался вопрос, есть ли простой способ вокруг сортировки кортежей в списках в питоне, например, если у меня есть список:сортировка кортежей в списках в питоне

list01 = ([a,b,c],[b,a,d],[d,e,c],[a,f,d]) 

и я отсортирован его, я хотел бы получить:

([a,b,c],[a,b,d],[c,d,e],[a,d,f])? 

или даже:

([a,b,c],[a,b,d],[a,d,f],[c,d,e]) 

, если это проще

Thanx заранее :)

+1

Btw. это набор списков, а не наоборот. –

+0

То есть: у вас нет кортежей в списке здесь. У вас есть списки в кортеже. '[]' окружает список. '()' окружает кортеж. –

ответ

6
>>> list01 = (['a','b','c'],['b','a','d'],['d','e','c'],['a','f','d']) 
>>> map(sorted, list01) 
[['a', 'b', 'c'], ['a', 'b', 'd'], ['c', 'd', 'e'], ['a', 'd', 'f']] 
>>> sorted(map(sorted, list01)) 
[['a', 'b', 'c'], ['a', 'b', 'd'], ['a', 'd', 'f'], ['c', 'd', 'e']] 
2

Простой как ...

list01 = (['a','b','c'],['b','a','d'],['d','e','c'],['a','f','d']) 

print(sorted(map(sorted,list01))) 
2

Вы можете использовать генератор вместо:

>>> list01 = (['a','b','c'],['b','a','d'],['d','e','c'],['a','f','d']) 
>>> tuple((sorted(item) for item in list01)) 
(['a', 'b', 'c'], ['a', 'b', 'd'], ['c', 'd', 'e'], ['a', 'd', 'f']) 

Карта быстрее, кстати. ;)

In [48]: timeit tuple(map(sorted, list01)) 
100000 loops, best of 3: 3.71 us per loop 

In [49]: timeit tuple((sorted(item) for item in list01)) 
100000 loops, best of 3: 7.26 us per loop 

Edit: сортировка на месте еще быстрее (спасибо Карл):

In [120]: timeit [item.sort() for item in list01 if False] 
1000000 loops, best of 3: 490 ns per loop 
+0

Сортировка на месте не требует создания нового кортежа. Еще быстрее в моих тестах (хотя он и создает новый список, он не заполняет его): '[item.sort() для элемента в списке01, если False]' - около 0.45 us за цикл. ;) В моей системе версия 'map' немного медленнее, а версия' sorted' значительно быстрее, так что есть только около 40% разницы в скорости вместо 95% или около того, о которой вы сообщаете. –

+0

И, конечно, использование уродливого 'if 0' вместо' if False' сокращает немного больше, потому что имя 'False' не нужно искать. Так что да, вот как вы оптимизируете микро-оптимизацию на Python (но если это так важно, почему бы вам не перейти на C?). –

+0

Я просто пытался показать несколько примеров, это все еще зависит от данных. Если их немного, я бы использовал кратчайший/более красивый/наиболее читаемый, если их много, я бы, вероятно, использовал Cython;) –

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