python的字典怎么扩展成C呢?拿啥数据结构接收?100分 详细进来~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python的字典怎么扩展成C呢?拿啥数据结构接收?100分 详细进来~相关的知识,希望对你有一定的参考价值。

PyObject *set(PyObject *self,Pyobject *args)
希望python调用传进来一个python字典,C怎么接收呢??
有没有高手详细给我讲讲,把QQ留下。 追加300分。 我想说 我这个是在ios里编程,要把object_C扩展成C 在扩展成python的 代码应该没几行。但是没接触过 好郁闷~

1、直接用PyObject。上策
2、转换成C++ STL的Map容器是直接对应的。中策
3、使用的是数据,而不是结构,只要能让中间的数据发挥作用,就没必要一样的结构,也就是转换成具体适合你那接下来C中应用的结构。比如只用到某几个键和某几个值。如果C中根本不应用,就回到1。中策
4、自己在C中实现这种字典。建立散列表或者红黑树表。或者最简单的两个一维数组,实现key[],value[]的一一对应。下策
参考技术A 楼上那个答的很好,直接使用PyObject才是正解,因为python的dict 的key-value
value可以是任何对象,所以C++中的map的value有可能没有对应的类型,不能做相应的转换。如果已知对应的类型,用map或hashmap也能行得通。
基本思路,我是以std::map为例子,就是下面这个样子:

//假定返回的字典是 dict,key是string类型,val是long整数类型
PyObject *dict =PyObject_CallObject(my_callback, arglist);
//想存到C++的字典pydict中去
std::map<string, long> pydict;
size_t len=PyObject_Size(dict);
PyObject *key_list = PyDict_Keys(dict); //return PyListObject
for(size_t i=0;i<len;++i)
PyObject *key = PyList_GetItem(key_list, i); //遍历每一个key
PyObject *value = PyDict_GetItem( dict, key); //查询value
long cval = PyInt_AsLong(value) //转换结果
string s = PyString_AsString(key);
pydict.insert(pydict.begin(), pair<string,long>(s, cval)); //插入到pydict


QQ

1417168175
参考技术B from __future__ import with_statement
import re

data_re = re.compile(ur'^:(\w+)\s+\("(.+?)"\)$')
data = []
with open('xxx.txt') as f:
for line in f:
if line.startswith(':'):
found = data_re.findall(line.strip())
if found:
data.append(found[0])

print data

[Python爬虫]高并发cnblogs博客备份工具(可扩展成并行)

并发爬虫小练习。

直接粘贴到本地,命名为.py文件即可运行,运行时的参数为你想要爬取的用户。默认是本博客。

输出是以用户名命名的目录,目录内便是博客内容。

仅供学习python的多线程编程方法,后续会重写成并行爬虫。

爬虫代码如下:

  1 # -*- coding:utf-8 -*-
  2 from multiprocessing.managers import BaseManager
  3 from pyquery import PyQuery
  4 import os, sys, urllib
  5 import re, random, logging, time
  6 import Queue, threading, multiprocessing, threadpool
  7 
  8 USER_NAME = kirai
  9 TOTAL_PAGE_NUMBER = 0
 10 INT_REGEXP = re.compile(([\\d]+))
 11 BASE_URL = http://www.cnblogs.com/+USER_NAME+/p/?page=
 12 ARTICLE_REGEXP = re.compile(href=\\"(http://www.cnblogs.com/+USER_NAME+/p/[\\d]+.html)\\")
 13 THREAD_NUMBER = multiprocessing.cpu_count() * 2
 14 ARTICLE_URLS_MUTEX = threading.Lock()
 15 ARTICLE_URLS = []
 16 
 17 class ListWithLinkExtend(list):
 18     def extend(self, value):
 19         super(ListWithLinkExtend, self).extend(value)
 20         return self
 21 
 22 def get_total_page_number():
 23     doc = PyQuery(url=BASE_URL)
 24     return int(INT_REGEXP.findall(
 25         doc.find(.pager .Pager).text())[0].encode(ascii))
 26 
 27 def get_page_url():
 28     global TOTAL_PAGE_NUMBER
 29     return map(lambda page: BASE_URL+str(page),
 30                          [i for i in range(1, TOTAL_PAGE_NUMBER+1)])
 31 
 32 def get_article_url(idx):
 33     url = PAGE_URLS[idx]
 34     doc = PyQuery(url=url)
 35     article_urls = ARTICLE_REGEXP.findall(str(doc.find(.PostList .postTitl2)))
 36     return article_urls
 37 
 38 def handle_result(request, result):
 39     global ARTICLE_URLS_MUTEX, ARTICLE_URLS
 40     try:
 41         ARTICLE_URLS_MUTEX.acquire()
 42         ARTICLE_URLS.append(result)
 43     finally:
 44         ARTICLE_URLS_MUTEX.release()
 45 
 46 def cluster_process():
 47     global ARTICLE_URLS
 48     # list : urls
 49     task_queue = Queue.Queue()
 50     # str : path
 51     result_queue = Queue.Queue()
 52     KiraiManager.register(get_task_queue, callable=lambda: task_queue)
 53     KiraiManager.register(get_result_queue, callable=lambda: result_queue)
 54     manager = KiraiManager(address=(‘‘, 6969), authkey=whosyourdaddy)
 55     manager.start()
 56     manager.shutdown()
 57     # article_flag, article_urls = get_article_url()
 58 
 59 # a simple way.
 60 def get_article(url):
 61     html = urllib.urlopen(url).read()
 62     return html, INT_REGEXP.findall(url)[0]
 63 
 64 def save_article(request, result):
 65     content = result[0]
 66     file_name = result[1]
 67     path = ./ + USER_NAME + / + file_name + .html
 68     try:
 69         fp = file(path, w)
 70         fp.writelines(content)
 71     finally:
 72         fp.close()
 73 
 74 def thread_process():
 75     global ARTICLE_URLS
 76     os.mkdir(USER_NAME)
 77     thread_pool = threadpool.ThreadPool(THREAD_NUMBER)
 78     requests = threadpool.makeRequests(get_article, ARTICLE_URLS, save_article)
 79     [thread_pool.putRequest(req) for req in requests]
 80     thread_pool.wait()
 81 
 82 def __main__(argv):
 83     global ARTICLE_URLS, TOTAL_PAGE_NUMBER, USER_NAME, BASE_URL, ARTICLE_REGEXP, PAGE_URLS, TOTAL_PAGE_NUMBER
 84     if len(argv) == 2:
 85         USER_NAME = argv[1]
 86     BASE_URL = http://www.cnblogs.com/+USER_NAME+/p/?page=
 87     ARTICLE_REGEXP = re.compile(href=\\"(http://www.cnblogs.com/+USER_NAME+/p/[\\d]+.html)\\")
 88     TOTAL_PAGE_NUMBER = get_total_page_number()
 89     PAGE_URLS = get_page_url()
 90     thread_pool = threadpool.ThreadPool(THREAD_NUMBER)
 91     requests = threadpool.makeRequests(
 92         get_article_url,
 93         [i for i in range(0, TOTAL_PAGE_NUMBER)],
 94         handle_result)
 95     [thread_pool.putRequest(req) for req in requests]
 96     thread_pool.wait()
 97     ARTICLE_URLS = list(reduce(lambda a, b: ListWithLinkExtend(a).extend(ListWithLinkExtend(b)),
 98                                                          ARTICLE_URLS))
 99     thread_process()
100 
101 if __name__ == __main__:
102     __main__(sys.argv)

 

简单介绍下全局变量的意义:

USER_NAME:希望爬取的用户名,默认为kirai。

TOTAL_PAGE_NUMBER:会被更新成博客随笔的总页数。

INT_REGEXP:为了匹配数字的正则。
BASE_URL:随笔页的初始URL。

ARTICLE_REGEXP:在经过pyquery处理过后的每个随笔目录页中提取出博客文章页面的正则。

THREAD_NUMBER:线程数,默认设置是本机cpu核数的2倍。

ARTICLE_URLS_MUTEX:ARTICLE_URLS的锁,保证线程唯一占用。

ARTICLE_URLS:用于存放所有的文章url。


以上是关于python的字典怎么扩展成C呢?拿啥数据结构接收?100分 详细进来~的主要内容,如果未能解决你的问题,请参考以下文章

汇编movsx和movzx的区别

verilog: 看代码时遇一问题:把两个12位的数扩展成13位相加,为啥在前面补最高位,不应该补0吗?

数组扩张一个维度 python

通过DG把单库扩展成RAC库的后续处理

hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)

23个Python爬虫开源项目代码