Сортировать каждый подсписок во вложенном списке - PullRequest
1 голос
/ 25 октября 2019

Пример:

если дано:

list1 = [[4,2],[9,4],[3,7],[7,3],[2,6],[1,4]]

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

[[2,4],[4,9],[3,7],[3,7],[2,6],[1,4]]

Порядок этих списков внутри списка не имеет значения. В конце я хочу, чтобы каждый основной элемент имел одинаковую комбинацию. как [3,7] и [3,7] вместо [3,7] и [7,3]

Ответы [ 2 ]

4 голосов
/ 25 октября 2019

Один способ - это сопоставление с sorted:

list(map(sorted, list1))
# [[2, 4], [4, 9], [3, 7], [3, 7], [2, 6], [1, 4]]

, что аналогично выполнению:

[sorted(i) for i in list1]
1 голос
/ 25 октября 2019

Это зависит от:

  • , если вы хотите сохранить исходные данные, т. Е. Получить новый объект, содержащий новые подсписки, вы можете использовать решение, предложенное в другой ответ

    list1 = [[4,2],[9,4],[3,7],[7,3],[2,6],[1,4]]
    list2 = [sorted(sublist) for sublist in list1]
    

    но учтите, что это обходится дорого, потому что вы должны выделить новую память для новых подсписков и внешнего контейнера, а также немаловажное замедление;

  • если вам не нужны исходные данные после операции сортировки, вы можете использовать тот факт, что объекты списка являются изменяемыми и, следовательно, можно выполнить сортировку по месту

    for sublist in list1: sublist.sort()
    

    thisПреимущество второго подхода состоит в том, что он не требует дополнительной памяти, и это немного быстрее, но, конечно, если впоследствии вам понадобятся исходные данные ...


Я упоминал, что .sort()это быстрее, чем sorted(), в основном из-за выделения новой памяти, поэтому позвольте мне представить небольшой, наивный тест, использующий %timeit magic

In [25]: l1 = [i for i in range(100000)]                                        

In [26]: %timeit -c -n 30 -r 20 (shuffle(l1) or l1)                             
119 ms ± 1.52 ms per loop (mean ± std. dev. of 20 runs, 30 loops each)

In [27]: %timeit -c -n 30 -r 20 sorted(shuffle(l1) or l1)                       
154 ms ± 1.41 ms per loop (mean ± std. dev. of 20 runs, 30 loops each)

In [28]: %timeit -c -n 30 -r 20 (shuffle(l1) or l1).sort()                      
148 ms ± 2.15 ms per loop (mean ± std. dev. of 20 runs, 30 loops each)

In [29]: print("%.3f%%"%(100*(154-148)/(148-119)))                                     
20.690%
IPython
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...