Python字典(dict)的setdefault()方法

如果需要统计一个字符串中每一个字符出现的次数,我会写出如下的代码:

Strings = "Welcome to my blog: blog.biochen.com!"
count = {}
for character in Strings:
	if character in count:
		count[character] = count[character] + 1
	else:
		count[character] = 0
		count[character] = count[character] + 1
print(count)

需要初始化字典中的元素的场景还是很常见的,似乎用if..else…看起来比较傻。不过Python内置了字典(dict)的setdefault()方法,上述代码可以写成这样子:

Strings = "Welcome to my blog: blog.biochen.com!"
count = {}
for character in Strings:
	count.setdefault(character, 0)
	count[character] = count[character] + 1
print(count)

dict.setdefault(key, default=None)的作用是,如果健不在字典中,将会添加健,并将值设置为默认值。
不过用if…else…比用setdefault()速度要快!!!

 

Python实现DNA序列互补、反向、反向互补

DNA有两条链,但是通常我们只用其中一条链来表示,另外一条链是它的反向互补序列。利用Python我们可以轻松地实现DNA序列的反向、互补、及反向互补。

定义函数DNA_complement()实现DNA序列互补配对,函数DNA_reverse() 实现DNA序列反向。

def DNA_complement(sequence):
    sequence = sequence.upper()
    sequence = sequence.replace('A', 't')
    sequence = sequence.replace('T', 'a')
    sequence = sequence.replace('C', 'g')
    sequence = sequence.replace('G', 'c')
    return sequence.upper()
 
def DNA_reverse(sequence):
    sequence = sequence.upper()
    return sequence[::-1]

我们来演示一下:

>>> DNA = "acctgCaG" #原序列
>>> DNA_complement(DNA) #互补序列
'TGGACGTC'
>>> DNA_reverse(DNA) #反向序列
'GACGTCCA'
>>> DNA_reverse(DNA_complement(DNA)) #反向互补序列
'CTGCAGGT'

Python去掉列表中的重复元素

集合(set)是不允许有重复元素的,我们可以将列表(list)转换为集合,再转换回列表。
>>> List1 = [“b”, “c”, “a”, “d”, “a”, “c”]
>>> List2 = list(set(List1))
>>> List2
[‘a’, ‘b’, ‘d’, ‘c’]
去除重复元素之后顺序变了,如果想要保持原来的顺序,可以将新列表按照原来的列表排序。
>>> List2.sort(key = List1.index)
>>> List2
[‘b’, ‘c’, ‘a’, ‘d’]
还可以换一种写法。
>>> List2 = sorted(set(List1), key = List1.index)
>>> List2
[‘b’, ‘c’, ‘a’, ‘d’]

适合Python的Vim的配置

Vim的基本配置是在用户的Home目录下建立一个.vimrc配置文件,Vim根据该文件的设定,体现具体的定制内容。

vim ~/.vimrc

用于Python的配置:

syntax on
filetype plugin indent on

syntax on 不仅仅用在Python,在其他编程语言中也有作用,根据语言语法进行高亮显示。
filetype plugin indent on 当打开扩展名为.py的文件,遇到def或者if等Python关键字后再遇到换行,会将光标自动缩进到合适的位置。

字符串转变量名

Python
eval()函数将字符串当成有效的Python表达式来求值,并返回计算结果。exec()函数将字符串当成有效的代码来执行。execfile()函数可以用来执行一个文件。

>>> eval("3 + 4")
7
>>> a = 1
>>> eval("a")
1
>>> exec("print(a)")
1
>>>

R
get()函数,它可以把某个字符串转换成变量名。

> a = 1
> get("a")
[1] 1

Python科学计算工具箱Anaconda

Python语言简洁,学习起来非常快,使用Python的科研工作者越来越多。Python拥有丰富的扩展包,这使得它可以轻松处理各种问题。
Python用于科学计算的包括但不限于如下:
Numpy:提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库等。
Scipy:提供许多科学计算函数库,包括统计,优化,整合,线性代数模块,傅里叶变换,信号和图像处理,常微分方程求解器等。
Pandas:基于Numpy,提供了大量库和一些标准的数据模型,比如二维数组。
Matplotlib:绘图包,旨在替代MATLAB。
……

Anaconda是一个集合,包括conda,python解释器,一些第三方库。
conda用于包管理和环境管理。包管理与pip类似,管理python第三方库。conda将一切都看成包,包括conda本身和python解释器。环境管理类似于virtualenv,能够允许用户使用不同版本的python和不同的第三方库环境,并灵活切换。

用Anaconda来管理环境和第三方库将是非常方便的,而且自己安装这些库对新手来说是一个不小的挑战。

Anaconda包括了科学、数学、工程、数据分析中最受欢迎的300多个python包,支持python2/3, Windows/Linux/Mac,而且还是非常有好的安装包(.exe/.sh/.pkg)。一键安装科学计算中常用的包,爽!

与在Windows中安装Anaconda类似,在Linux上安装Anaconda也非常简单。

sh Anaconda3-5.1.0-Linux-x86_64.sh

安装过程中会提示安装的路径PREFIX=/home/chenwen/anaconda3,还会提示是否将此路径添加到用户的环境变量(/home/chenwen/.bashrc)。

安装Anaconda之后,Win键+R,输入’cmd’,进入命令行窗口,输入如下命令验证Anaconda是否安装成功,并查看它的版本。

conda --version

Anaconda安装成功之后,我们首先将软件源修改为国内镜像,运行如下命令。

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

我们现在就可以通过create命令来创建虚拟环境了。

conda create --name tensorflow python=3.5

这样我就创建了一个名叫tensorflow的虚拟环境,当然你可以用任何你喜欢的名字代替。我还指定了Python版本是3.5。

环境创建完毕后,我们可以使用info命令查看所有环境。

conda info --envs

如果需要切换到该虚拟环境,可以使用activate命令。

activate tensorflow

如果想取消激活,使用deactivate命令即可。

deactivate tensorflow

如果想删除虚拟环境,使用remove命令。

conda remove --name tensorflow --all

当我们切换到某个虚拟环境后,就可以进行第三方库的管理了。如果只是简单的学习Python,直接用系统环境就可以了,没有必要创建虚拟环境。

查看安装的包,可以使用list命令。

conda list

如果你发现某个包默认没有装,比如scikit-learn,可以使用conda install 命令安装。

conda install scikit-learn

更新包,可以使用conda update命令

conda update scikit-learn

此外,我还非常喜欢Anaconda带的IDE工具spyder,比起python官方自带的IDLE强很多,但是又不复杂。

(2018年5月22日更新!)

Python random(随机)模块

>>>import random
>>>random.random()    #[0,1)中的随机浮点数
0.02343375500378797
>>>random.randint(1, 10)    #[x, y]中的随机整数
8
>>>L = [1, 2, 3, 4,]
>>>random.shuffle(L)    #就地打乱
>>>L
[2, 1, 3, 4]
>>>random.choice(L)    #选择随机一项
2
>>> random.sample(L, 2)    #不重复地选择多项
[1, 3]
>>> [random.choice(L) for _ in range(4)]    #可重复地选择多项,反复调用random.choice
[4, 4, 3, 4]

random模块实际上生成的基于一种内部状态的确定性的伪随机数。虽然是伪随机数,但是已经能够满足大部分统计分析的需求了,大胆用吧!如果你想得到可重复的结果,可用random.seed()生成随机数种子。

>>> random.seed(8)
>>> random.random()
0.2267058593810488
>>> random.seed(8)
>>> random.random()
0.2267058593810488

2015年5月30日更新