对一组值进行排序[关闭]


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
元组与该问题有什么关系,您尝试了什么?
Fred Foo

3
我认为python集没有排序的概念。这可能会帮助您:stackoverflow.com/questions/1653970/…–
zallarak

3
一套是无序的。这是它的特性之一。每种语言。使用一个list
Karoly Horvath

4
@KarolyHorvath“一个集合是无序的。这是它的属性之一。在每种语言中。” C ++ std::set是有序的。
蒂莫西·希尔兹

17
为什么人们在事实结束后就关闭(或脱离话题)这个问题?是的,如果OP描述他的问题而不是让我们把它从他身上捞出来,那就更好了。但是,既然我们已经做到了,并编辑了他的问题以使其匹配,并且他已经接受了答案,那么我不认为亲密投票的意义何在。
abarnert

Answers:


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']

有关更多信息,请参阅官方文档中的Sorting HOWTO


*请参阅注释以了解例外情况。


1
@TimothyShields:是的,我应该说“每一种不喜欢滥用通用术语的编程语言”。在“非修饰”表示“变异”的语言中,set“排序列表” 就不足为奇了,而您必须说unordered_set的是“集合”……
abarnert

2
这个名字是好是坏不是要讨论的内容。“从不以任何语言对集进行排序”的说法是错误的。
蒂莫西·希尔兹

5
在Wikipedia页面上找不到关于数学集的单词“ unordered”。您也不会找到单词“ ordered”。那是因为它集合上的数学运算无关。特定语言是否选择按顺序排列集是实现细节。zh.wikipedia.org/wiki/Set_(数学)
蒂莫西·希尔兹

3
@TimothyShields:同时,您链接的Set(数学)上的Wikipedia页面上没有单词“ unordered”,因为从定义中已经很明显了。特别是,“当且仅当集合A和B具有完全相同的元素时,它们才相等”。对于有序集合不是这样。(也有类似这样的句子:“集合或多集合中元素的列出顺序无关紧要”,因此,即使您进行了一些不同的搜索,即使不了解概念也可以找到它。)
abarnert

3
@TimothyShields:但是std::set 确实公开了排序(不仅仅是通过API的明显方式;排序功能实际上是任何给定集合类型一部分)。始终按严格的弱顺序对元素进行排序的事实是该概念定义的一部分。因此,您的论点是没有根据的。但是,即使不是,那又为什么呢?集合几乎在每种编程语言中都是无序的,就像在数学中一样。事实是,只有一种外来语言使用该词来表示其他含义,这一事实并没有使该说法不那么正确。
abarnert
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.