排序字符向量时的结果不同

时间:2016-04-21 00:57:31

标签: python r sorting character

我想知道R排序算法在排序字符向量时如何工作

a = c("aa(150)", "aa(1)S")
sort(a)
# [1] "aa(150)" "aa(1)S" 
a = c("aa(150)", "aa(1)")
sort(a)
# [1] "aa(1)" "aa(150)"

R不是从左到右逐个比较字符的整数值吗?添加角色的原因可以改变结果吗?

我认为排序由“5”和“)”字符决定,后面的字符被忽略。

与Python比较

In [1]: a=["aa(150)","aa(1)"]
In [2]: sorted(a)
Out[2]: ['aa(1)', 'aa(150)']
In [3]: a=["aa(150)","aa(1)S"]
In [4]: sorted(a)
Out[4]: ['aa(1)S', 'aa(150)']

1 个答案:

答案 0 :(得分:3)

将语言环境设置为默认值,在大多数情况下将关闭特定于语言环境的排序:

Sys.setlocale("LC_COLLATE", "C")
a=c("aa(150)","aa(1)S")
sort(a)
#[1] "aa(1)S"  "aa(150)"

由于语言差异,字符串排序必须具有国际特异性。来自?sort的帮助:

  

字符向量的排序顺序取决于整理   正在使用的语言环境的序列:参见比较。

然后我们可以转到?Comparisons

  

字符向量中字符串的比较是字典中的字典   使用正在使用的语言环境的整理顺序的字符串:请参阅   语言环境。诸如en_US的语言环境的整理顺序通常是   不同于C(应该使用ASCII)并且可能令人惊讶。   谨防对整理顺序做出任何假设:例如在   爱沙尼亚语Z介于S和T之间,并且不一定是整理   逐个字符 - 在丹麦语中作为单个字母排序,之后   ž。在威尔士语中,可能是也可能不是单个排序单元:如果是它   跟着g。

如上所述,因为每种语言都以不同的方式使用字母,所以语言环境对排序很重要。