Python的基本知识及sorted

1. 基本数据结构

1.1 容器类型

1.1.1 列表(List)

      列表是Python中存放有序对象的容器,可以容纳任何数据类型:数值、布尔型、字符串等。

bb = []
bb.append(1)
bb.append("hello")
print bb

aa = [1, 2,3, "hello", True]
print aa

1.1.2 Tuple

     Tuple不支持修改其值。 

bb = (1,3,"AAA")
print bb

1.1.3 字典(Dictionary)

     字典是一个存放无序的键值映射(Key:Value)类型的数据容器,键的类型可以是数字或字符串。

dic = {}
dic["aa"] = "cat"
dic[2] = "I love you"
print dic

dic1 = {"bb":"I have dinner", 2:"Hello"}
print dic1
print "dic1[2]=", dic1[2]
print dic1["bb"]

1.1.4 集合(Set)    

     集合是指由不同的元素组成的合集,集合支持一些数学运算,如并集(|)、交集(&)、补集(-)。

a=[1,2,3]
b=[3,4,5,6]
sa = set(a)
sb = set(b)
print "sa=", sa
print "sb=", sb
print "sa-sb=", sa-sb
print "sa|sb=", sa|sb
print "sa&sb=", sa&sb

1.1.5 列表推导式

dd = [1,2,5,9,3]
ddd = [x*4 for x in dd]
print ddd
   其效果与下面代码相同:
dd = [1,2,5,9,3]
ddd = []
for x in dd:
    ddd.append(x*4)
print ddd



2. sorted

    sorted的派排序功能真强大,从前一直使用C++、Java以为其功能很强大了,但与Python一比,真的要差一些。

2.1 函数定义

     sorted(iterable, cmp=None, key=None, reverse=False)

     把iterable中的items进行排序之后,返回一个新的列表,原来的iterable没有任何改变

      1) iterableiteralbe指的是能够一次返回它的一个成员的对象。iterable主要包括3类:

        第一类是所有的序列类型,比如list(列表)、str(字符串)、tuple(元组)。 
        第二类是一些非序列类型,比如dict(字典)、file(文件)。
        第三类是你定义的任何包含__iter__()或__getitem__()方法的类的对象。
     2) cmp: 指定一个定制的比较函数,这个函数接收两个参数(iterable的元素),如果第一个参数小于第二个参数,返回一个负数;如果第一个参数等于第二个参数,返回零;如果第一个参数大于第二个参数,返回一个正数。默认值为None。
     3)key:指定一个接收一个参数的函数,这个函数用于从每个元素中提取一个用于比较的关键字。默认值为None。
     4)reverse:是一个布尔值。如果设置为True,列表元素将被降序排列,默认为升序排列。
         通常来说,key和reverse比一个等价的cmp函数处理速度要快。这是因为对于每个列表元素,cmp都会被调用多次,而key和reverse只被调用一次。

2.2 使用方法

2.2.1 列表排序

intlist = [2,5,9,0,10]
newlist= sorted(intlist) # generate a new list
print newlist
intlist.sort()           # this list is changed
print intlist
结果是一样的,一个是原列表未被改变,一个原列表被改变了

2.2.2 Key Functions(关键字函数)

  list.sort()和sorted()方法都有一个key参数来说明一个函数,这个函数在做比较之前会对list中的每个元素进行调用。
  例如,这里是一个大小写不敏感的字符串比较:

newStr = sorted("This is a test string from Andrew".split(), key=str.lower)
print newStr
    结果如下:

['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

     key的值应该是一个函数,这个函数接收一个参数并且返回一个用于比较的关键字。这种技术比较快,原因在于对每个输入记录,这个函数只会被调用一次。
    对复杂对象的比较通常是使用对象的切片作为关键字。例如:

student_tuples = [('Jerry', 'A', 15), ('Tom', 'C', 12),('Bill', 'B', 10)]
sort_tuples = sorted(student_tuples, key=lambda student: student[2])  # sort by age, that is the third element of tuple
print sort_tuples

    结果如下:

[('Bill', 'B', 10), ('Tom', 'C', 12), ('Jerry', 'A', 15)]

2.2.3 Operator模块中的函数

operator module中有itemgetter,attrgetter两个函数,可以更方便地获取元组中的元素和自定义对象中的属性,在使用前需要:

from operator import itemgetter, attrgetter
student_tuples = [('Jerry', 'A', 15), ('Tom', 'C', 12),('Bill', 'B', 10)]
opr_sort_tuples = sorted(student_tuples, key=itemgetter(2))
print opr_sort_tuples

更神奇之处在于它可支持多级排序。例如先按成绩排序,再按年龄排序,但只能都为升序或降序

student_tuples = [('Jerry', 'A', 15), ('Tom', 'B', 12),('Bill', 'B', 10)]
opr_sort_tuples = sorted(student_tuples, key=itemgetter(1,2))
print opr_sort_tuples
结果如下:

[('Jerry', 'A', 15), ('Bill', 'B', 10), ('Tom', 'B', 12)]

2.2.4 排序稳定性和复杂排序

排序稳定性和复杂的排序 从Python2.2开始,排序都保证是稳定的。意思是当多个记录有相同的关键字时,它们原始的排序保留。
这个好的特性能让你建立复杂的排序。例如,将学生记录按成绩降序排序、按年龄升序排列。先按年龄排序,再按成绩排序。

student_tuples = [('Jerry', 'C', 15), ('Tom', 'B', 12),('Bill', 'B', 10)]
age_asc = sorted(student_tuples, key=itemgetter(2))
print age_asc
score_desc = sorted(age_asc, key=itemgetter(1), reverse=True)
print score_desc

student_tuples = [('Jerry', 'C', 15), ('Tom', 'B', 12),('Bill', 'B', 10)]
age_asc = sorted(student_tuples, key=lambda x: x[2])
print age_asc
score_desc = sorted(age_asc, key=lambda x: x[1], reverse=True)
print score_desc



  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值