您的位置:首页 > 理论基础 > 数据结构算法

数据结构-字典经典习题

2018-04-04 14:51 253 查看

导文

习题的经典之处在于把每一系列的习题玩透,编程的业务逻辑和思想就是经常使用的此类解决问题的逻辑,因此把握好每到经典习题

用户输入一个数字

打印每一位数字及其重复的次数

题目分析总结

1.此题分析点在于字典的构建,通过构建字典来分析数据的重复次数

2.此题要总结reversed()函数,此函数要总结学习使用,reversed(seq)函数内部是序列。

Return a reverse iterator. seq must be an object which has a reversed() method or supports the sequence protocol (the len() method and the getitem() method with integer arguments starting at 0).

reversed()函数返回的是一个翻转迭代器,另外seq必须是序列对象,满足序列协议。

此题解法如下

#!/bin/python3
#-*- coding: UTF-8 -*-
from collections import OrderedDict
num = input('your number: ')
dictnum = OrderedDict()
for key in reversed(num):
print(key,end=" ")
#此处避免使用三目表达式,True statement if expression else False statement
#三目表达式True后面是statement动作,而本题此处是expression
if not key in dictnum:
dictnum[key] = 1
else:
dictnum[key] += 1
print()
print(dictnum)
运行结果:
your number: 23423
3 2 4 3 2
OrderedDict([('3', 2), ('2', 2), ('4', 1)])


数字重复统计

随机产生100个整数

数字的范围[-1000,1000]

values值升序输出所有不同的数字及其重复的次数

题目分析总结

1.字典统计重复次数

2.随机random的使用

3.sorted()和sort()的使用

首先学习sorted(可参考安装说明书Python HOWTOs中的排序):

语法:sorted(iterable[, key][, reverse])

Return a new sorted list from the items in iterable 返回一个新的经过排序后的list从可迭代对象中获取到的

key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None (compare the elements directly).

key是指定一个函数的参数,这个函数用于提取列表的比较对象,或比较内容,默认为None

reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.

翻转是根据bool值确定是否对排序后的列表进行翻转

二者的区别有如下两点

**第一点:**list.sort()是不会生成新的列表,就原有的内存排序根据key值排序要求就地修改,内存空间发生改变,只能用于列表。

第二点:sorted是对可迭代对象都可以进行排序,并生成新的序列

4.就此题而言参考可参考安装说明书Python HOWTOs中的排序可知,还可以采用另外一种方式排序就是operator模块。

此题解法1(sorted)

#!/bin/python3
#-*- coding: UTF-8 -*-
import random
lstnum = [random.randint(0,10) for i in range(100)]
dictnum = {}
for key in lstnum:
if not key in dictnum:
dictnum[key] = 1
else:
dictnum[key] += 1
print(dictnum)
#采用sorted(iterable,key,reverse)
for w in sorted(dictnum,key=dictnum.get,reverse=True):
print(w,dictnum[w],end= "###")
运行结果:
{0: 10, 1: 13, 2: 14, 3: 8, 4: 12, 5: 4, 6: 12, 7: 4, 8: 9, 9: 10, 10: 4}
2 14###1 13###4 12###6 12###0 10###9 10###8 9###3 8###5 4###7 4###10 4###


此题解法2(operator)

#!/bin/python3
#-*- coding: UTF-8 -*-
import random
import operator
lstnum = [random.randint(0,10) for i in range(100)]
dictnum = {}
for key in lstnum:
if not key in dictnum:
dictnum[key] = 1
else:
dictnum[key] += 1
print(dictnum)
#采用operator模块进行比较
sorted_dictnum = sorted(dictnum.items(),key=operator.itemgetter(1))
print(sorted_dictnum)
运行结果:
{0: 11, 1: 9, 2: 8, 3: 10, 4: 6, 5: 8, 6: 10, 7: 11, 8: 12, 9: 6, 10: 9}
[(4, 6), (9, 6), (2, 8), (5, 8), (1, 9), (10, 9), (3, 10), (6, 10), (0, 11), (7, 11), (8, 12)]


字符串重复统计

字符表’abcdefghijklmnoppqrstuvwxyz’

随机挑选2个字母组成字符串,共挑选10个

降序输出所有不同的字符串及重复的次数

此题考点

1.字符表中随机取两,可以通过采样,但是采样会从中取出两个不同的字符,

2.如果通过随机索引,此时可以组合成任意的两个字符

3.列表生成式的写法,列表生成式每一个参数后面紧跟限制条件,有点像一个循环中多个if条件时,if是嵌套和还是兄弟关系,同样在列表生成式中限制条件同样也有限制条件,限制条件有些是嵌套关系,嵌套关系则随着变量紧跟其后,兄弟关系最后一次性写多个if条件。

4.排序方法,根据之前的学习可知排序通常两种方式,随机选择即可

此题解法

#!/bin/python3
#-*- coding: UTF-8 -*-
import random
stri = 'abcdefghigklmnopqrstuvwsyz'
#采用列表生成式达到效率更高、更快的效果
lst = [''.join(stri[random.randint(0,25)] for i in range(2)) for _ in range(10)]
dictalp = {}
for key in lst:
if not key in dictalp:
dictalp[key] = 1
else:
dictalp[key] += 1
for k in sorted(dictalp,key=dictalp.get):
print(k,dictalp[k],end='##')
运行结果:
ib 1##pq 1##ke 1##eo 1##dk 1##ww 1##si 1##ld 1##gs 1##hl 1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: