资讯专栏INFORMATION COLUMN

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

Ocean / 1736人阅读

摘要:找出列表中小于的数据除了列表推导式,还有字典推导式,集合推导式,用法都一样。如果你的数据量很大的话,考虑使用生成器表达式。切片不仅对列表有用,同样适用于元组和字符串。切片命名使用方法,内部参数与切片一样。对剩余的的数据,使用星号代替即可。

上次我们讲了几个不常见的数据类型,每个都有自己特殊的用途,虽然不经常用到,了解一下也好。比如我们提到的数组类型,如果在数据量很大的时候同时要效率,就可以使用它。这次来说说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)
 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,带你走进机器学习的世界。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44537.html

相关文章

  • python奇遇数据结构窥探3

    摘要:字典和集合都是基于散列表实现的,散列表也就是表,了解过数据结构的应该知道。而使用另一种办法,任何键在找不到的情况下都会用中的值数据类型比如替换。在设计时就可以使用创建你的数据接口。 这次主要说说字典和集合这两种数据类型。 字典和集合都是基于散列表实现的,散列表也就是hash表,了解过数据结构的应该知道。与散列表相关的一个概念叫做可散列,什么是可散列?在python官方定义中是这样说的:...

    toddmark 评论0 收藏0
  • Python奇遇数据结构窥探

    摘要:挤掉了堆中实现了堆排序。你可以用堆排序来查找一个序列中最大的或者最小的几个元素。除了使用堆排序,中还有排序和,这两个排序最终生成以列表表示的排序结果,堆排序也是。 这次我们来说说python中的数据结构。当然了,不会讲很基础的内容。 用过python的都知道,python有着与其他语言很不一样的数据类型,像什么列表、元组、集合、字典之类。这些数据类型造就了python简单易用同时又很强...

    mrli2016 评论0 收藏0
  • Python奇遇:特殊方法窥探

    摘要:在中,特殊方法以双下划线开始,以双下划线结束。真假值,如果向量模为,返回实现向量加法实现向量乘法,例如返回向量的模返回欧几里德范数找个例子运行下。怎么办中有个特殊方法,可以修改控制台输出的样式。 什么是特殊方法?当我们在设计一个类的时候,python中有一个用于初始化的方法$__init__$,类似于java中的构造器,这个就是特殊方法,也叫作魔术方法。简单来说,特殊方法可以给你设计的...

    niceforbear 评论0 收藏0
  • python奇遇:迭代器和生成器

    摘要:来说说迭代器和生成器,还有可迭代对象和生成器表达式。有点绕是不是,其实,一般只要知道可迭代对象以及它是如何实现的就行了,中常常用生成器来代替迭代器,可以说,生成器就是迭代器。 来说说迭代器和生成器,还有可迭代对象和生成器表达式。 之前简单的提到过,一个对象是可迭代的可以理解为能够使用for循环。这样说其实不太准确,某个对象可迭代是因为它内部实现了$__iter__$这个特殊方法。比如在...

    atinosun 评论0 收藏0
  • python奇遇:隐藏的python功能

    摘要:先不讲数据结构了,这次来说说中一些不被注意的功能。直接交换第二个功能。对的长度使用生成一个序列,然后遍历或者这样第三个功能。其实还接受第二个参数,它的作用是在迭代的过程中如果碰到第二个参数则停止。 先不讲数据结构了,这次来说说python中一些不被注意的功能。 在python的设计哲学中,有这么一条内容:Simple is better than complex,简单的代码比复杂的要好...

    APICloud 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<