Сортування набору значень [закрито]


112

У мене є такі значення:

set(['0.000000000', '0.009518000', '10.277200999', '0.030810999', '0.018384000', '4.918560000'])
set(['4.918859000', '0.060758000', '4.917336999', '0.003949999', '0.013945000', '10.281522000', '0.025082999'])  

Я хочу сортувати значення в кожному setв порядку збільшення. Я не хочу сортувати між множинами, але значеннями в кожному наборі.


3
Які кортежі стосуються проблеми і що ви спробували?
Фред Фоо

3
Я не думаю, що набори пітонів мають концепцію впорядкування. Це може допомогти вам: stackoverflow.com/questions/1653970 / ...
zallarak

3
набір без замовлення. це одна з його властивостей. будь-якою мовою. використовувати a list.
Каролі Хорват

4
@KarolyHorvath "набір не має порядку. Це одна з його властивостей. На кожній мові". C ++ std::setвпорядковано.
Тимофій Шилдс

17
Чому люди закрили (або поза темою) це питання після факту? Так, було б краще, якби ОП описала його проблему, а не змушувало нас витягувати її з нього. Але тепер, коли ми це зробили, відредагували його питання на відповідність, і він прийняв відповідь, я не бачу, як закриття голосування має сенс.
abarnert

Відповіді:


218

З коментаря:

Я хочу сортувати кожен набір.

Це просто. Для будь-якого набору s(або будь-якого іншого, що можна змінити) sorted(s)повертає список елементів sу відсортованому порядку:

>>> s = set(['0.000000000', '0.009518000', '10.277200999', '0.030810999', '0.018384000', '4.918560000'])
>>> sorted(s)
['0.000000000', '0.009518000', '0.018384000', '0.030810999', '10.277200999', '4.918560000']

Зауважте, що sortedце дає вам, а listне set. Це тому, що вся сукупність множини, як в математиці, так і майже в кожній мові програмування , * полягає в тому, що це не впорядковано: множини {1, 2}і {2, 1}це однаковий набір.


Напевно, ви не дуже хочете сортувати ці елементи як рядки, але як числа (тому 4.918560000 надійде раніше 10.277200999, а не після).

Найкраще рішення, швидше за все, зберігати цифри як числа, а не рядки. Але якщо ні, вам просто потрібно використовувати keyфункцію:

>>> sorted(s, key=float)
['0.000000000', '0.009518000', '0.018384000', '0.030810999', '4.918560000', '10.277200999']

Для отримання додаткової інформації див. Сортування HOWTO в офіційних документах.


* Дивіться коментарі щодо винятків.


1
@TimothyShields: Ти маєш рацію, я мав би сказати "кожну мову програмування, яка не любить зловживати загальними термінами". Мовою, де "немодифікуючий" означає "мутувати", це не дивно, що setозначає "відсортований список", і ви повинні сказати, unordered_setщо означає "встановити" ...
abarnert

2
Добре це чи погано, це не те, що обговорюється. Заява про те, що "набори ніколи не впорядковуються будь-якою мовою" є хибним.
Тімоті Шилдс

5
На сторінці Вікіпедії про математичний набір ви не знайдете слова "не упорядкований". Ви також не знайдете слово "замовлено". Це тому, що це не має значення для математичних операцій на множинах. Незалежно від того, яка конкретна мова вирішує замовляти набори, це деталь реалізації. en.wikipedia.org/wiki/Set_(mathematics)
Тімоті Шилдс

3
@TimothyShields: Тим часом, на сторінці вікіпедії в Set (математиці), яку ви пов’язали, немає слова "не упорядкований", оскільки це вже очевидно з визначення. Зокрема, "Набори A і B рівні, якщо і тільки якщо вони мають точно однакові елементи". Це не вірно для замовлених колекцій. (Є також речення на кшталт: "Порядок, у якому перераховані елементи набору чи мультисети, не має значення", тож якби ви просто шукали трохи інакше, ви могли б його знайти навіть не розуміючи поняття.)
abarnert

3
@TimothyShields: Але std::set це виставити порядок ( а не тільки в очевидних шляхів через API, функція упорядкування фактично частиною типу будь-якого заданого набору). Той факт, що елементи завжди відсортовані за строгим слабким порядком, є частиною самого визначення цього поняття. Отже, ваш аргумент - суперечливий. Але навіть якби це не було, чому б це мало значення? Набори не упорядковані майже в кожній мові програмування, як і в математиці. Той факт, що існує одна навколишня мова, яка використовує слово для позначення чогось іншого, не робить це твердження менш правдивим.
abarnert
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.