Python奇遇记:数据结构窥探2

上次我们讲了几个不常见的数据类型,每个都有自己特殊的用途,虽然不经常用到,了解一下也好。比如我们提到的数组类型,如果在数据量很大的时候同时要效率,就可以使用它。这次来说说python中常见的数据类型像列表、元组、字典、集合中的一些很有用的技巧,帮助你提高开发效率。

来看看。

列表有一个很有用的技巧是使用列表推导式,这个大家可能都知道,如果你需要迭代列表中的数据,使用循环是个很麻烦的事,使用列表推导式一行就搞定。

datas = [3, 4, 2, 8, 12, 5, 7]
# 找出列表中小于10的数据
print([data for data in datas if data<10])
[3, 4, 2, 8, 5, 7]

除了列表推导式,还有字典推导式,集合推导式,用法都一样。还有一个特殊的生成器表达式,生成器表达式并不会在刚开始就生成一个数据类型,而是在迭代时才生成,这样可以节省内存。如果你的数据量很大的话,考虑使用生成器表达式。生成器表达式使用小括号。

# 使用上面的数据
# 生成器表达式使用小括号
r = (data for data in datas if data<10)
# 你看,打印r时并不会输出结果
print(r)
# 现在就可以了
# enumerate同时返回下标和元素
for i, j in enumerate(r):
    print(i, j)
<generator object <genexpr> at 0x7f7c93644db0>
0 3
1 4
2 2
3 8
4 5
5 7

需要注意的事,生成器表达式一次只能用一次迭达,上面我们对r进行了一次迭代,如果再次输出就是空的。

关于什么是生成器我们下次再讲。

如果我们需要找出列表中的某个数据?或者是某一部分的数据?

使用切片。切片不仅对列表有用,同样适用于元组和字符串。切片中以冒号间隔,前两个参数为起始点,第三个为步长,也就是每隔几个找一个出来。

a = [2, 3, 'a', 6, 4]
print(a[3:4])

b = 'hahahah'
# 步长为2
print(b[::2])
# 如果步长设为1,就是从后往前取值
# 对b取反
print(b[::-1])

c = (2, 2, 3, 4, 5)
print(c[:3])
[6]
hhhh
hahahah
(2, 2, 3)

每次都用数字表示切片的起始点看起来很麻烦对不对,还要记住从哪开始从哪结束。如果你需要对很多不同的数据都执行同样的切片操作,最好是为切片命名,这样只需定义一次就行了。切片命名使用slice方法,内部参数与切片一样。

items = [1, 2, 3, 4, 5, 6, 7]
# slice用来对切片命名,比如规定这个切片是从2到4,2个步长,然后就可以使用了
a = slice(2, 4)
print(a)
print(items[a])

# 其它的数据也能用
itemss = [1, 2, 4, 6, 5, 6, 7]
print(itemss[a])
slice(2, 4, None)
[3, 4]
[4, 6]

还有一个技巧叫做拆包,就是把一个列表或者字符同时赋值给多个变量,任何可迭代对象(也就是能够用for循环)都可以使用拆包。比如有一个函数返回了多个数据,我们在调用时就可以直接赋值给多个变量,而不用再定义一个数据类型,然后再赋值。多麻烦啊。

a, b, c = [1, 2, 4]
print(a)
a, b = 'it'
print(a)
1
i

有一个问题,如果我的数据很多,难道要一个一个赋值给变量。多麻烦啊。对剩余的的数据,使用星号代替即可。如果数据不是你需要的,使用_代替,使用其它的字符也是可以的,这只是一个约定而已。

# 可以这样
data = [1, 2, 3, 4, 5, 6]
a, b, *r = data
print(r)
# 也可以这样
*a, b, c, d = data
print(a)
[3, 4, 5, 6]
[1, 2, 3]

最后一个技巧。

如果我们需要统计一个序列(字符串、列表、元组)中某个元素出现的次数,怎么实现?循环这个序列,利用元素的下标,如果某个元素出现则加1,想想都麻烦。使用collections.Counter。counter中有个most_common方法,接受需要统计的元素个数作为参数。例子如下:

words = [
    'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes',
    'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around', 'the',
    'eyes', "don't", 'look', 'around', 'the', 'eyes', 'look', 'into',
    'my', 'eyes', "you're", 'under'
]
from collections import Counter
word_counts = Counter(words)
# 出现频率最高的3个单词
top_three = word_counts.most_common(3)
print(top_three)
[('eyes', 8), ('the', 5), ('look', 4)]

限于篇幅,还有许多awesome的技巧没有涉及,下篇文章我们再讲。希望上面说的一些东西对你有帮助。


本人才疏学浅,上文中难免有些错误,还请各位品评指正。如果觉得写的还行,欢迎关注我的公众号MLGroup,带你走进机器学习的世界。
图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值