0

我一直在尝试这些代码,但有问题。我只是想知道第一个字符串是否按字母顺序排列。

def alp(s1):
    s2=sorted(s1)
    if s2 is s1:
        return True
    else:
        return False

这总是打印 False,当我说打印 s1 或 s2 时,它说“NameError:名称's1'未定义”

4

5 回答 5

5

is是比较对象 ID 的身份测试,==是平等测试:

In [1]: s1 = "Hello World"
In [2]: s2 = "Hello World"

In [3]: s1 == s2
Out[3]: True

In [4]: s1 is s2
Out[4]: False

另请注意,它sorted返回一个列表,因此将其更改为:

if ''.join(s2) == s1:

或者

if ''.join(sorted(s2)) == s1:
于 2012-11-19T15:37:11.567 回答
4

我会使用它iter来很好地获取前一个元素:

def is_ordered(ss):
   ss_iterable = iter(ss)
   try:
       current_item = next(ss_iterable)
   except StopIteration:
       #replace next line to handle the empty string case as desired.
       #This is how *I* would do it, but others would prefer `return True`
       #as indicated in the comments :)
       #I suppose the question is "Is an empty sequence ordered or not?"
       raise ValueError("Undefined result.  Cannot accept empty iterable")

   for next_item in ss_iterable:
       if next_item < current_item:
           return False
       current_item = next_item
   return True

这个答案在绝对最坏的情况下具有复杂性 O(n),而不是依赖于sortO(nlogn) 的答案。

于 2012-11-19T15:42:16.153 回答
4

您可以看到这个答案并使用适用于任何序列的东西:

all(s1[i] <= s1[i+1] for i in xrange(len(s1) - 1))

例子:

>>> def alp(s1):
...     return all(s1[i] <= s1[i+1] for i in xrange(len(s1) - 1))
...
>>> alp("test")
False
>>> alp("abcd")
True
于 2012-11-19T15:43:35.063 回答
2

确保您将字符串与字符串进行比较:

In [8]: s = 'abcdef'

In [9]: s == ''.join(sorted(s))
Out[9]: True

In [10]: s2 = 'zxyw'

In [11]: s2 == ''.join(sorted(s2))
Out[11]: False

如果s1ors2是一个字符串,sorted将返回一个列表,然后您将一个字符串与一个列表进行比较。为了进行您想要的比较, using''.join()将获取列表并将所有元素连接在一起,本质上创建一个表示已排序元素的字符串。

于 2012-11-19T15:38:30.710 回答
2

使用这样的东西:

sorted()返回一个列表,并且您正在尝试将列表与字符串进行比较,因此首先将该列表更改为字符串:

In [21]: "abcd"=="".join(sorted("abcd"))
Out[21]: True

In [22]: "qwerty"=="".join(sorted("qwerty"))
Out[22]: False

#comparsion of list and a string is False
In [25]: "abcd"==sorted("abcd")
Out[25]: False
于 2012-11-19T15:39:03.003 回答