上药三品,神与气精

曾因酒醉鞭名马 生怕情多累美人


  • 首页

  • 关于

  • 分类

  • 标签

  • 归档

  • 搜索

see_python的基础数据结构

发表于 2018-12-14 | 阅读次数:
字数统计: 622 | 阅读时长 ≈ 2

列表list

  • 以完全随机的列表考虑平均情况。

列表是以数组(Array)实现的。最大的开销发生在超过当前分配大小的增长,这种情况下所有元素都需要移动;或者是在起始位置附近插入或者删除元素,这种情况下所有在该位置后面的元素都需要移动。如果你需要在一个队列的两端进行增删的操作,应当使用collections.deque(双向队列)

操作 平均情况 最坏情况
复制 O(n) O(n)
append O(1) O(1)
插入 O(n) O(n)
取元素 O(1) O(1)
更改元素 O(1) O(1)
删除元素 O(n) O(n)
遍历 O(n) O(n)
取切片 O(k) O(k)
删除切片 O(n) O(n)
更改切片 O(k+n) O(k+n)
extend O(k) O(k)
排序 O(n logn) O(n logn)
列表乘法 O(nk) O(nk)
x in s O(n)
min(s), max(s) O(n)
计算长度 O(1) O(1)

双端队列queue

deque (double-ended queue,双向队列)是以双向链表的形式实现的 (Well, a list of arrays rather than objects, for greater efficiency)。双向队列的两端都是可达的,但从查找队列中间的元素较为缓慢,增删元素就更慢了。

操作 平均情况 最坏情况
复制 O(n) O(n)
append O(1) O(1)
appendleft O(1) O(1)
pop O(1) O(1)
popleft O(1) O(1)
extend O(k) O(k)
extendleft O(k) O(k)
rotate O(k) O(k)
remove O(n) O(n)

集合set

操作 平均情况 最坏情况
x in s O(1) O(n)
并集 s\ t O(len(s)+len(t))
交集 s&t O(min(len(s), len(t)) O(len(s) * len(t))
差集 s-t O(len(s))
s.difference_update(t) O(len(t))
对称差集 s^t O(len(s)) O(len(s) * len(t))
s.symmetric_difference_update(t) O(len(t)) O(len(t) * len(s))

字典dict

下列字典的平均情况基于以下假设:

  1. 对象的散列函数足够鲁棒性(robust),不会发生冲突。
  2. 字典的键是从所有可能的键的集合中随机选择的。

小窍门:只使用字符串作为字典的键。这么做虽然不会影响算法的时间复杂度,但会对常数项产生显著的影响,这决定了你的一段程序能多快跑完。

操作 平均情况 最坏情况
复制 O(n) O(n)
取元素 O(1) O(n)
更改元素 O(1) O(n)
删除元素 O(1) O(n)
遍历 O(n) O(n)

python-ds

发表于 2018-12-11 | 分类于 web | 阅读次数:
字数统计: 550 | 阅读时长 ≈ 1

谈谈python的基础数据结构?

这个是有时候 被问到的“基础”问题

python的内置类型

python的一个“显著”问题 就是它留給开发者的选择太多。

很多代码 要么就是效率低下 要么就是过于啰嗦。

字符串与字节

python3 只有一种能够保存文本信息的数据类型,就是str

它是不可变的数据类型(序列) 保存的是unicode码位

字节字符串 在python3 当中使用bytes对象来处理

鉴于字符串的不变性 字符串可以作为字典的键或者set的元素,因为一旦初始化之后字符串的值就不会改变。

字符串比较常用的方法 是拼接

集合类型

  • 元组
  • 列表
  • 字典
  • 集合set

通常元组和列表会被对比来看

列表是动态的,其大小可变;
元组是不可变的,一旦创建就不能被修改。

需要考虑一个问题 就使用来说 列表非常广泛?为什么还需要元组!

Cpython的列表根本就不是列表,而是长度可变的数组。

高级一些必备 列表的推导式

枚举enumerate
zip函数

字典 也就是hash

字典推导式和列表推导式具有相同的优点 更加高效、简短、整洁

以前很多返回值不再是列表类型,python3当中返回的是迭代器

Cpython使用伪随机探测的散列表作为字典的底层数据结构。

python3.6重新实现了字典 改变了以前字典是无序的状态

集合

当元素顺序的重要性不如元素的唯一性和测试元素是否包含在集合中的效率时,大部分情况会使用集合

集合有两种;可变的set 不可变的frozenset

集合也具有推导式的写法

更多的扩展数据类型 在collections模块当中

  • 命名元组
  • 双端队列
  • chainmap
  • counter
  • 有序字典
  • 默认字典

类以下当中有哪些高级语法

迭代器和生成器
yield
装饰器
上下文管理器

for…else…
函数注解

python字符串问题

发表于 2018-12-11 | 分类于 web | 阅读次数:
字数统计: 681 | 阅读时长 ≈ 2

一、字符串类型

python3:

python语言有两种不同的字符串,一个用于存储文本,一个用于存储原始字节。
文本字符串内部使用Unicode存储,字节字符串存储原始字节并显示ASCII。
python3中,文本型字符串类型被命名为str,字节字符串类型被命名为bytes。
正常情况下,实例化一个字符串会得到一个str实例,如果希望得到一个bytes实例,需要在文本之前添加b字符。

python2

中也有两种字符串,不过,python3中的str类在python2中名称为unicode,但是,python3中的bytes类在python2中名称为str类。
这意味着在python3中str类是一个文本字符串,而在python2中str类是一个字节字符串。
若不使用前缀实例化字符串,则返回一个str类(这里是字节字符串!!!),如果想要得到一个文本字符串,需要在字符串前面加上u字符。

二、字符串转换

python3:

可以在str与bytes之间进行类型转换,str类包含一个encode方法,用于使用特定编码将其转换为一个bytes。于此类似,bytes类包含一个decode方法,接受一个编码作为单个必要参数,并返回一个str。另一个需要注意的是,python3中永远不会尝试隐式地在一个str与一个bytes之间进行转换,需要显式使用str.encode 或者 bytes.decode方法。

python2:

与python3不同的是,python2会在文本字符串和字节字符串之间尝试进行隐式转换。
该工作机制是,如果解释器遇到一个不同种类的字符串混合操作,解释器首先会将字节字符串转换为文本字符串,然后对文本字符串进行操作。
解释器在将字节字符串转换为文本字符串的过程中使用隐式解码,python2中默认编码几乎总是ASCII.
我们可以使用sys.getdefaultencoding 方法来查看默认编码方式。

三、读取文件

python3:

文件总是存储字节,因此,为了使用文件中读取的文本数据,必须首先将其解码为一个文本字符串。
python3中,文本正常情况下会自动为你解码,所以打开或读取文件会得到一个文本字符串。
使用的解码方式取决系统,在mac os 或者 大多数linux系统中,首选编码是utf-8,但windows不一定。
可以使用locale.getpreferredencoding()方法得到系统的默认解码方式。

python2:

python2中,无论以何种方式打开文件,read方法总是返回一个字节字符串

js0010

发表于 2018-12-11 | 阅读次数:
字数统计: 131 | 阅读时长 ≈ 1

使用箭头函数来绕过函数上下文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html>
<head>
<title>Using arrow functions to work around callback function contexts</title>
<meta charset="utf-8">
<script src="../assert.js"></script>
<link rel="stylesheet" type="text/css" href="../assert.css">
</head>
<body>
<button id="test">Click Me!</button>
<script>
function Button() {
this.clicked = false;
this.click = () => {
this.clicked = true;
assert(button.clicked, "The button has been clicked");
}
}
var button = new Button();
var elem = document.getElementById("test");
elem.addEventListener("click", button.click);
</script>
</body>
</html>

js0009

发表于 2018-12-11 | 阅读次数:
字数统计: 148 | 阅读时长 ≈ 1
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

<!DOCTYPE html>
<html>
<head>
<title>Using a constructor to set up common objects</title>
<meta charset="utf-8">
<script src="../assert.js"></script>
<link rel="stylesheet" type="text/css" href="../assert.css">
</head>
<body>
<script type="text/javascript">
function Ninja() {
this.skulk = function() {
return this;
};
}

var ninja1 = new Ninja();
var ninja2 = new Ninja();

assert(ninja1.skulk() === ninja1,
"The 1st ninja is skulking");
assert(ninja2.skulk() === ninja2,
"The 2nd ninja is skulking");
</script>
</body>
</html>

将函数作为构造函数进行调用是比较强大的一个特性

1…636465…109
John Cheung

John Cheung

improve your python skills

543 日志
33 分类
45 标签
RSS
GitHub Email
© 2020 John Cheung
本站访客数:
|
主题 — NexT.Pisces v5.1.4
博客全站共226.3k字