排序并删除重复数据
一、排序函数 sort() 和 sorted()
sort() 是 Python 列表的一个内置的排序方法,list.sort()
方法排序时直接修改原列表,返回None;
sorted() 是 Python 内置的一个排序函数,它会从一个迭代器返回一个排好序的新列表。
相比于 sort(),sorted() 使用的范围更为广泛,但是如果不需要保留原列表,sort 更有效一点。另外,sort() 只是列表的一个方法,只适用于列表,而sorted()
函数接受一切迭代器,返回新列表。
这两个方法有以下 2 个共同的参数:
- key 是带一个参数的函数,返回一个值用来排序,默认为 None。这个函数只调用一次,所以 fast。
- reverse 表示排序结果是否反转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| >>> a = (1,2,4,2,3) >>> a.sort() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'tuple' object has no attribute 'sort' >>> sorted(a) [1, 2, 2, 3, 4]
>>> a=['1',1,'a',3,7,'n'] >>> sorted(a) [1, 3, 7, '1', 'a', 'n'] >>> a ['1', 1, 'a', 3, 7, 'n'] >>> print a.sort() None >>> a [1, 3, 7, '1', 'a', 'n']
|
因此如果实际应用过程中需要保留原有列表,使用 sorted() 函数较为适合,否则可以选 择 sort() 函数,因为 sort() 函数不需要复制原有列表,消耗的内存较少,效率也较高。
sorted() 函数功能非常强大,它可以方便地针对不同的数据结构进行排序,从而满足不同需求。例子如下:
1 2 3 4
| >>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
>>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}.values())
|
1 2 3 4 5
| >>> student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10)] >>> sorted(student_tuples, key = lambda student: student[0]) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] >>> sorted(student_tuples, key = lambda student: student[2]) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
|
- 调用operator模块中的 itemgetter() 可以实现根据多个参数排序
1 2 3 4 5 6
| >>> sorted(student_tuples, key = itemgetter(2)) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] >>> sorted(student_tuples, key = itemgetter(1, 2)) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] >>> sorted(student_tuples, key = itemgetter(1, 2), reverse=True) [('jane', 'B', 12), ('dave', 'B', 10), ('john', 'A', 15)]
|
ps: itemgetter 返回一个函数,实现取元素的功能。比如
f = itemgetter(2),调用 f(r) 返回 r[2];
f = itemgetter(2, 5, 3),调用 f(r) 返回元组 (r[2], r[5], r[3]).
二、python集合(set)操作
python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差) 和 sysmmetric difference(对称差集)等数学运算.
1 2 3 4
| >>> x = set('spam') >>> y = set(['h','a','m']) >>> x, y (set(['a', 'p', 's', 'm']), set(['a', 'h', 'm']))
|
1 2 3 4 5 6 7 8
| >>> x & y set(['a', 'm'])
>>> x | y set(['a', 'p', 's', 'h', 'm'])
>>> x - y set(['p', 's'])
|
记得以前个网友提问怎么去除海量列表里重复元素,用 hash 来解决也行,只不过感觉在性能上不是很高,用 set 解决还是很不错的,示例如下:
1 2 3 4 5 6 7
| >>> a = [11,22,33,44,11,22] >>> b = set(a) >>> b set([33, 11, 44, 22]) >>> c = [i for i in b] >>> c [33, 11, 44, 22]
|
集合用于包含一组无序的对象。要创建集合,可使用 set() 函数并像下面这样提供一系列的项:
1 2 3
| s = set([3,5,9,10])
t = set("Hello")
|
与列表和元组不同,集合是无序的,也无法通过数字进行索引。此外,集合中的元素不能重复。例如,如果检查前面代码中 t 集合的值,结果会是:
1 2
| >>> t set(['H', 'e', 'l', 'o'])
|
注意只出现了一个 ‘l’ 。
集合支持一系列标准操作,包括并集、交集、差集和对称差集,例如:
1 2 3 4
| a = t | s b = t & s c = t – s d = t ^ s
|
基本操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| t.add('x') s.update([10,37,42])
t.remove('H')
len(s)
x in s
x not in s
s.issubset(t) s <= t
s.issuperset(t) s >= t
s.union(t) s | t
s.intersection(t) s & t
s.difference(t) s - t
s.symmetric_difference(t) s ^ t
s.copy()
hash(s)
s.update(t) s |= t
s.intersection_update(t) s &= t
s.difference_update(t) s -= t
s.symmetric_difference_update(t) s ^= t
s.remove(x)
s.discard(x)
s.pop()
s.clear()
|
三、str和list排序 删除重复数据
1 2 3 4
| >>> a =[1,1,2,3,4,5,4,2,3,1] >>> b =sorted(set(a)) >>> print(b) [1,2,3,4,5]
|
1 2 3 4
| >>> a=[1,1,2,3,4,5,4,2,3,1] >>> a.sort() >>> print (a) [1, 1, 1, 2, 2, 3, 3, 4, 4, 5]
|
1 2 3 4 5 6
| >>> a="abchabcgesdfaad" >>> b=list(a) >>> b.sort() >>> s="".join(b) >>>print (s) aaaabbccddefghs
|
1 2 3 4 5
| >>> a="abchabcgesdfaad" >>> b=list(a) >>> c=sorted(set(b)) >>> c ['a','b','c','d','e','f','g','h','s']
|