【问题标题】:writing a function that checks if tuples, lists and strings are sorted编写一个检查元组、列表和字符串是否排序的函数
【发布时间】:2020-10-06 00:54:01
【问题描述】:

我正在尝试构建一个函数,如果输入的元组、列表和字符串已排序,则打印 true,否则打印 False。我尝试了两种不同的方法,但都没有成功。谁能告诉我哪部分出了问题?谢谢!!!

def is_ordered (*args):        
    for i in range(1,len(args)):
        if args[i - 1] > args[i]:
            return True
        else:
            return False
        
def is_ordered (*args):        
    if args == args.sorted()
        return True
    else:
        return False

这是我创建的列表和元组。

sorted_list = [1,2,3,4,5,6,7]
is_ordered(sorted_list)
unsorted_list = [41,3,35,4,45,6,7]
is_ordered(unsorted_list)
sorted_tuple = (1,2,3,4,5,6,7)
is_ordered(sorted_tuple)
unsorted_tuple = (41,3,35,4,45,6,7)
is_ordered(unsorted_tuple)
stri = "datascience"
is_ordered(stri)

【问题讨论】:

  • 您的函数采用 one 参数,而不是函数签名建议的多个参数
  • 你的函数在第一次迭代时也立即返回
  • 你为什么使用*args而不是常规参数?

标签: python list function sorting tuples


【解决方案1】:

您实际上不需要对输入进行排序来判断它是否已排序。您只需要查看每个项目是否小于或等于它之前的项目,如果不是,则返回 False。这将比排序然后检查更有效。

您可以通过将列表与自身以zip(seq, seq[1:] 之类的偏移量压缩列表来将项目与邻居进行比较。

def is_ordered (seq):
    '''Return true if every item is less than or equal the item after it'''
    return all(a <= b for a, b in zip(seq, seq[1:]))

is_ordered('abcd')
#True

is_ordered('abdag')
#False

is_ordered([1, 2, 3, 4])
#True

如果您想要使用sorted(),请不要使用*args,只需接受一个序列作为参数,并了解sorted(someString) 不等于字符串,因为它会生成一个列表。所以你需要比较类似的东西:

def is_ordered (seq):
    return list(seq) == sorted(seq)

is_ordered((1, 2, 3))
#True

is_ordered((1, 2, 3, 0))
#False

is_ordered("abcd")
# True

is_ordered("abcda")
# False

【讨论】:

  • 嗨,马克,感谢您的回复!这是针对基本入门级数据科学课程的。我想知道它是否能够在没有 zip 的情况下做到这一点(它太先进了,我们还没有了解它。谢谢!
  • @GraceWang 查看使用sorted() 的编辑(另外,zip() 是基本的python——值得尽早学习,因为它经常出现)
  • 非常感谢 Mark 这真的很有帮助!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多