#encoding:utf-8
fin = open(‘1.txt’, ‘r’)
‘’’
建立正向索引:
“文档1”的ID > 单词1:出现位置列表;单词2:出现位置列表;…………
“文档2”的ID > 此文档出现的关键词列表。
‘’’
forward_index = {}
for line in fin:
line = line.strip().split()
forward_index[int(line[0])] = {}
words = line[1].split(’,’)
for i, index in enumerate(words):
if int(index) not in forward_index[int(line[0])].keys():
forward_index[int(line[0])][int(index)] = [i]
else:
forward_index[int(line[0])][int(index)].append(i)
print ‘forward_index:’, forward_index
‘’’
建立倒排索引:
“关键词1”:“文档1”的ID,“文档2”的ID,…………
“关键词2”:带有此关键词的文档ID列表。
‘’’
inverted_index = {}
for doc_id, words in forward_index.items():
for word_id in words.keys():
if word_id not in inverted_index.keys():
inverted_index[word_id] = [doc_id]
elif doc_id not in inverted_index[word_id]:
inverted_index[word_id].append(doc_id)
print ‘inverted_index:’, inverted_index
输入(文档id:单词id):
1 3,4
2 3,4,2,4
3 2
输出:
forward_index: {1: {3: [0], 4: [1]}, 2: {2: [2], 3: [0], 4: [1, 3]}, 3: {2: [0]}}
inverted_index: {2: [2, 3], 3: [1, 2], 4: [1, 2]}
Python实现字符串反转的几种方法
要求:在Python环境下用尽可能多的方法反转字符串,例如将s = "abcdef"反转成 “fedcba”
第一种:使用字符串切片
result = s[::-1]
第二种:使用列表的reverse方法
l = list(s)
l.reverse()
result = “”.join(l)
当然下面也行
l = list(s)
result = “”.join(l[::-1])
第三种:使用reduce
result = reduce(lambda x,y:y+x,s)
第四种:使用递归函数
def func(s):
if len(s) <1:
return s
return func(s[1:])+s[0]
result = func(s)
第五种:使用栈
def func(s):
l = list(s) #模拟全部入栈
result = “”
while len(l)>0:
result += l.pop() #模拟出栈
return result
result = func(s)
第六种:for循环
def func(s):
result = “”
max_index = len(s)-1
for index,value in enumerate(s):
result += s[max_index-index]
return result
result = func(s)
Python并行编程的几个要点
一、基于线程的并行编程
如何使用Python的线程模块
如何定义一个线程
如何探测一个线程
如何在一个子类中使用线程
Lock和RLock实现线程同步
信号实现线程同步
条件(condition)实现线程同步
事件(event)实现线程同步
如何使用with语句
使用队列实现线程消息传递
如何评估多线程应用的性能
兑现成编程的危险
二、基于进程的并行编程
如何使用Python的multiprocessing模块
如何生成一个进程
如何命名一个进程
如何在后台运行一个进程
如何杀死一个进程
如何在子类中使用进程
如何在进程间交换对象
使用队列在进程间交换对象
使用管道在进程间交换对象
如何实现进程同步
如何管理不同进程间的状态
如何使用进程池
如何使用Python的mpi4py模块
端到段通信
避免死锁问题
使用广播(broadcast)进行集体间通信
使用散点(scatter)函数进行集体间通信
三、异步编程
如何使用concurrent.futures模块
Asyncio事件循环管理
Asyncio处理协程
Asyncio任务管理
Dealing with Asyncio and Futures
Gevent
Tornado
Twsited
四、分布式Python
使用Celery分布任务
如何通过Celery创建任务
SCOOP科学计算
SCOOP处理map函数
Pyro4远程方法调用
Pyro4对象组链
使用Pyro4开发客户/服务应用
PyCSP进程序列化通信
Disco的MapReduce使用
RPyC远程程序调用
Python解析非标准JSON(Key值非字符串)
采集数据的时候经常碰到一些JSON数据的Key值不是字符串,这些数据在JavaScript的上下文中是可以解析的,但在Python中,没有该部分数据的上下文,无法采用json.loads(JSON)的形式导入。在网上搜集来一些方法以便日后使用。
方法一:
def parse_js(expr):
“”"
解析非标准JSON的Javascript字符串,等同于json.loads(JSON str)
:param expr:非标准JSON的Javascript字符串
:return:Python字典
“”"
obj = eval(expr, type(‘Dummy’, (dict,), dict(getitem=lambda s, n: n))())
return obj
方法二(推荐)
def parse_js(expr):
“”"
解析非标准JSON的Javascript字符串,等同于json.loads(JSON str)
:param expr:非标准JSON的Javascript字符串
:return:Python字典
“”"
import ast
m = ast.parse(expr)
a = m.body[0]
def parse(node):
if isinstance(node, ast.Expr):
return parse(node.value)
elif isinstance(node, ast.Num):
return node.n
elif isinstance(node, ast.Str):
return node.s
elif isinstance(node, ast.Name):
return node.id
elif isinstance(node, ast.Dict):
return dict(zip(map(parse, node.keys), map(parse, node.values)))
elif isinstance(node, ast.List):
return map(parse, node.elts)
else:
raise NotImplementedError(node.__class__)
return parse(a)