Categories
日常应用

从R到python散记(结束更新)

算是留条后路吧...anyway学门新语言总比学门新的课程简单一些。

1. 循环
Python 君貌似不是很喜欢操纵下标(不是C),循环比较直接:

for i in forset:

而不是for index in range(len(forset)): i=forset(index)

While和R的用法基本一直。也可以直接break跳出。

2. 集合操作
Python里面也有set类函数若干。最基本的就是变成set,比如
set([0,1])这样,就是0和1两个元素的集合。然后就是基本的集合操作:
差集:set_a-set_b,对应R里面的setdiff(set_a, set_b),(原生)R里面没有set这一类型,所以没法直接重新定义集合减法。
交集:set_a&set_b,对应R里面的intersect().
并集:set_a+set_b,对应R里面的union().
元素x属于set_a:x in set_a,对应R里面的操作符%in% (不写成函数形式)
判断空集:len(set_a)==0,对应R里面length(set_a)==0,貌似还有个is.empty()函数,忘了是R的还是matlab的了。

3. 字符串操作
从数字转到字符串:str(1),对应R里面as.character(1).唯一不同的是,R的函数可以直接应用到一个vector上,而python里面只能map()一下才可以。(向量化编程强迫症的孩子桑不起)
字符串操作也蛮好玩的,典型的面向对象风格。
字母计数:str_a='abcda'; str_a.count('a') #返回2
字符排序:一个字符串可以直接用list()打散,R里面就需要strsplit()函数了。然后str_list.sort()一下就可以了。注意该函数无返回值,也不需要再赋值给一个新的对象,自动替换原对象。
替换:str.replace() ,对应R里面gsub()
字符分割:str.split(),对应R的strsplit().

4. 基本的数学操作
好像这里和R或者matlab没什么特别大的区别...

5. 打印到屏幕
Python 2.7下print是个命令直接用,比如print 'a'+'b'这样,3.0之后就和R更像了,函数形式print('a'+'b'),等价于R的print(paste0("a","b"))或者cat("a","b")。

貌似也可以直接 print 'a', base, 'c' 这样

6. 文件操作
表示没有类似R的read.table()函数极为不爽...原始的,file.open(), file.readlines()各种吐血...好吧这一点其实和C更像,也更有效率(R也是封装了好几层,速度慢)。

7. List
这个就类似于R的vector这样,需要list()声明或者直接写进去[]里面。
增加元素:list.append(), 对应R的c()
移除元素:list.remove(), 对应R的 = NULL赋值

----------3.13更新------------

8. 键盘输入

raw_input("Enter a word ")

9. 字典 Dictionary

应该是python里面蛮有意思的数据结构,一共两列,第一列key第二列value

赋值的方式也很多样:

>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}

len(d)返回长度,d[key]返回对应值,del d[key]删除某个key,d.copy()复制该字典,d.get('a',0)返回value或者0,d.keys()或者d.values()返回所有的key或者values,d.update(a=1)增加或者覆盖原有key。

--------------3.22 更新---------------

10. 笛卡尔积

就是类似于R里面的grid.factor()用法,python里面好直接:

[ (a,b,c) for a in range(max_a) for b in range(max_b) for c in range(max_c)]

11. 循环调用

这种方法我貌似在R里面很少写,不过在python里面确实感觉很方便。

def helpLaceStrings(s1, s2, out):
	#print s1+s2+out
	if s1 == '':
		return out+s2#PLACE A LINE OF CODE HERE
	if s2 == '':
		return out+s1#PLACE A LINE OF CODE HERE
	else:
		return helpLaceStrings(s1[1:],s2[1:],out+s1[:1]+s2[:1])

就是一个函数可以循环调用自己...呃。等价的循环写法是:

for i in range(min_len):
	lacestr = lacestr + s1[i]+s2[i]
lacestr = lacestr+ s1[(i+1):]+s2[(i+1):]

大神勿喷,小白慢慢体会python的神奇之中。

12. 函数嵌套

呃,这俩居然是等价的,python真是够fly...

def sqrt(a):
    def tryit(x):
        return 0.5 * (a/x + x)
    return fixedPoint(tryit, 0.0001)

以及

def babylon(a):
    def test(x):
        return 0.5 * ((a / x) + x)
    return test

def sqrt(a):
    return fixedPoint(babylon(a), 0.0001)

--------------3.29更新------------

13. list到字符串

小小的有点tricky,就是利用join()函数,"".join(return_text) 这样就好了。

14. dict增加新项目

其实就是update()函数...caesar_dict.update(new_dict)就好了。

15. 改变工作目录

基本就是等同于R的setwd(),python里面叫做os.chdir().

16. list中的index

虽然python君不喜欢index,但是还是离不开呀...所以要用到list.index()这样,比如返回最大值对应的index: values.index(max(value))

---------------4.14更新--------

研究了一下class...还有继承....好吧其实感觉我还是看得云里雾里。比较重要的就是往里面传参数...是__init__这样。然后可以自定义自己的function,还有导入re来实现正则表达式。

class WordTrigger(Trigger):
    def __init__(self,word):
        self.words = word.lower()
    def  isWordIn(self,text):
        import string 
        import re       
        splitted_word = re.split('\W+',text.lower())
        return self.words in splitted_word

---------------4.22更新--------

其实一直在跟的是MITx: 6.00.1x Introduction to Computer Science and Programming这门课,edX平台上的。今天考完试了,大结局还不错,漏了两个problem sets不去做课堂作业,居然还有80%入账,哈哈哈。

2014-04-22 16_32_23-6.00.1x Progress _ edX

啦啦啦,就这样吧。终于搞懂了编程的“继承”概念,感觉python君还是蛮灵活的,各种递归什么的不在话下。

21 replies on “从R到python散记(结束更新)”

可用 pandas 包操作文件和处理数据:http://pandas.pydata.org/pandas-docs/stable/io.html

Comments are closed.