使用过两门以上编程语言;至少精通一门编程语言
2 年以上 Python 经验;或 5 年以上开发经验
如下面试题,如感兴趣可以将题目答案及简历发送至 [email protected] 邮箱,期待与你的相遇!
有 20 种不同的树形 dict ,需要映射为结构更简单的扁平化 dict 。 为了不进行硬编码,需要写一个 python 库,定义一套规则,完成从树形字典的映射为扁平化字典。 注意两个字典的对应字段的名称可能是不同的。 说明库的设计思路,实现思路。
in_data= { u'deliveryOrder': { u'warehouseCode': u'OTHER', u'deliveryOrderCode': u'3600120100000', u'receiverInfo': { u'detailAddress': u'\u5927\u5382\u680818\u53f7101', u'city': u'\u4e94\u8fde', u'province': u'\u5c71\u4e1c', u'area': u'\u5927\u5382' }, u'senderInfo': { u'detailAddress': u'\u6587\u4e09\u8def172\u53f7', u'city': u'\u676d\u5dde', },
}, u'orderLines': { u'orderLine': { u'itemId': u'0192010101', u'planQty': u'20', } }
}
#以下为库主程序运行后的范例数据输出 out_data : { 'warehouse_code': u'OTHER',
'express_code': u'3600120100000',
'receiver_area': u'\u5927\u5382', 'receiver_province': u'\u5c71\u4e1c', 'receiver_address': u'\u5927\u5382\u680818\u53f7101', 'receiver_city': u'\u4e94\u8fde', 'sender_city': u'\u676d\u5dde', 'sender_address': u'\u6587\u4e09\u8def172\u53f7', 'lines': [ { 'item_id': u'0192010101', 'product_qty': u'20' } ],
}
![]() | 1 Harveyguo OP 公司网址 http://www.vwms.cn ;天使轮;目前团队不到 20 人,产品 5 月份上线,已有 5 家企业用户;其他情况欢迎来电来函咨询。 |
2 yuku 2016-08-11 16:01:44 +08:00 via iPhone 以前听说面试时帮对方解决问题? |
![]() | 5 cxyfreedom 2016-08-11 16:04:17 +08:00 如果考虑到不同型的 dict ,范例输出的 lines 不是还没有完全扁平吗 |
6 qianbaooffer 2016-08-11 16:04:35 +08:00 boss 值聘上好像聊过 |
![]() | 7 luluuulu4848 2016-08-11 16:04:44 +08:00 @yuku 同感。。。 |
![]() | 8 Harveyguo OP 额~你这个顾虑怎么解决呢?把我们 3 月份实现的这段代码发上来? |
![]() | 9 luluuulu4848 2016-08-11 16:05:22 +08:00 @yuku 这一看就是公司业务上的需求 |
![]() | 10 shyling 2016-08-11 16:06:56 +08:00 {aA:{bB:c}}变为{aa_bb:c}然后再根据情况去掉前缀 /删掉不需要的 |
![]() | 11 Harveyguo OP @yuku @luluuulu4848 @wd85318 各位大牛,如果真的需要解决这个问题,那会直接把这个问题发上来求教的, Python 开源社区这么多,有必要用这种方式解决实际的业务问题吗?如果连这个问题都需要用这种方式来解决,那我的 CTO 就可以直接洗洗睡了…… 之所以用实际的业务问题是希望面试者没有地方去搜索答案而已,如果各位有更好的题目或者方式,欢迎赐教。 |
12 hitmanx 2016-08-11 16:17:14 +08:00 这种拿关键字一搜就有了,我能想到的关键字 "python nested dictionary flatten" 然后就看到了 SO 上例如 http://stackoverflow.com/questions/6027558/flatten-nested-python-dictionaries-compressing-keys 好像还有个库 https://pypi.python.org/pypi/flatdict 等等,都没点进去细看。 |
![]() | 13 Magic347 2016-08-11 16:51:34 +08:00 dfs 可解 |
![]() | 14 domty 2016-08-11 17:13:30 +08:00 这个很难吗? 感觉就是把一个多层的树遍历出来成为一个集合。 但是为什么后面的 u'senderInfo': { u'detailAddress': u'\u6587\u4e09\u8def172\u53f7', u'city': u'\u676d\u5dde', },}, u'orderLines': { u'orderLine': { u'itemId': u'0192010101', u'planQty': u'20', } } 在结构上没看出什么区别,而后面的那个解析出来却是个 list ? |
![]() | 15 Yinz 2016-08-11 17:50:47 +08:00 纯好奇,说一下我的思路看看:D 看起来这个字段名称映射不是简单的拼接 key ,估计需要使用时指定一个映射表的结构。 所以大概是一个递归函数 flattening(),参数两个,分别是 struct_dict 和 target_dict 。 函数 for 遍历 target_dict.items(), 每个元素,先读取 tmp = struct_dict[key],判断 tmp 类型 是 str/unicode ,则 value 是数据字段,则 result_dict[key] = value ; tmp 仍是 dict ,则 sub_dict = flattening(tmp, value) ,然后合并 result_dict 和 sub_dict ,可以循环合并,可以 from collections import ChainMap 然后是 struct_dict 大概是这个样子的 { u 'deliveryOrder': { u 'warehouseCode': u 'warehouse_code', u 'deliveryOrderCode': u 'express_code', u 'receiverInfo': { u 'detailAddress': u 'receiver_address', u 'city': u 'receiver_city', u 'province': u 'receiver_province', u 'area': u 'receiver_area' }, u 'senderInfo': { u 'detailAddress': u 'sender_address', u 'city': u 'sender_city', }, }, u 'orderLines': { u 'orderLine': u'lines' } } 不过这样, lines 下面的元素名称映射就不好搞了,我想到的办法是映射字符串特殊标记,不过这样 struct_dict 就很复杂难看了,暂时还没有想到优雅的方案。如果没有这个 list 一切都好说:( 这样写下来感觉这个问题的难点就是那个结果里面的 list 了,不知最后的方案是怎么样解决的?纯好奇,希望能看到答案:D |
16 hitmanx 2016-08-11 17:51:29 +08:00 对的,就是一棵多叉树遍历, dfs 就行。 |
![]() | 17 vnady 2016-08-11 19:47:43 +08:00 这种招聘挺好的,节约彼此的时间。比直接面试靠谱。 |
![]() | 18 mymike 2016-08-11 20:08:31 +08:00 映射并存储字段名称 |
![]() | 19 guyskk 2016-08-11 20:19:40 +08:00 以前写过一个类似的,用递归实现。 https://github.com/guyskk/walkdict |
![]() | 20 zhuangzhuang1988 2016-08-11 20:31:36 +08:00 不错 不错, 薪资不错。。 |
21 WinterWu 2016-08-11 21:35:59 +08:00 via iPhone 题目中写了字段名可能不同,因此总要用某种表。 1 ,直接将源 dict 字段和目标字段构建一个 dict , 2 ,抽象出规则,将无法用规则表达的用额外 dict 实现。具体到怎么扫描整个 dict 这个最简单就是迭代轮询,也可以用各种算法。 但是,这个题目没说清楚最重要的问题:场景,数据量,表规模。场景:像这样的诉求我猜很可能在数据库中转换数据存储方式,那就应该直接使用数据库自身功能实现,比如 mongo agg 处理。数据量:少量数据情况下根本不值得写什么库,极大数据量情况下用 python 可能也麻烦。当然实际中还要考虑很多其它因素。 抛开上面的问题,只说题目,那直接写个 mapping 轮询就好了 |
![]() | 22 newghost 2016-08-11 22:35:17 +08:00 via iPhone 所以没事还是别发面试题了 这么多人 challenge |
23 owt5008137 2016-08-11 22:43:37 +08:00 via Android https://github.com/xresloader/xresloader/blob/master/README.md 是不是和我这个相反?结构化转非结构化不要太简单。 扁平化的数据转树形结构才麻烦 |
![]() | 24 likuku 2016-08-11 22:46:22 +08:00 技术都可以学习培养,由解题所无法获知的另一些非技术面的信息反而在工作中更重要吧 |
![]() | 25 IMRES 2016-08-11 23:21:45 +08:00 via iPhone 喜欢这样的招聘帖,直接 |
![]() | 26 garytqq 2016-08-12 08:08:02 +08:00 感觉很像这个东西完成的功能: from flask_restful import marshal 数据是变化的, key/field 不变的话,建立源 key/field 到目标 key/field 的映射关系,使用上面的方法 |
![]() | 27 Harveyguo OP @mymike 有兴趣交流下吗? [email protected] |
![]() | 28 Harveyguo OP 各位大牛,有愿意找工作的吗?我该怎么联系你们呢?真急死我了。。。。 补充一下我们的情况吧,项目是去年底启动的, 3 月份发布测试版, 5 月份上线第一个用户。因为是面向企业后端的 SaaS 应用,所以业务上的细节还是比较多,主要针对电商企业的仓库管理效率,算是企业效率工具类的软件。技术是 Python+AngularJS ,做了自动化测试看板,目前每周迭代,节奏还是比较快。计划在 Q4 下轮融资,期待与大家共同实现梦想! |
![]() | 29 yutian2211 2016-08-12 17:11:51 +08:00 。。。。。招聘网站 |
![]() | 30 daocloud 2016-08-13 11:16:36 +08:00 ![]() DaoCloud 发来贺电! |
![]() | 31 dh7758 2016-08-13 11:52:39 +08:00 套路 |
![]() | 32 ntop 2016-08-13 20:35:13 +08:00 任何发明新算法的都是耍流氓,这个很简单其实抽象出来就是一个爬虫的应用。输入的数据结构类似于一个网页,输出扁平化的结构类似于爬虫的结果,所以借鉴 XMLPath 的做法,定义映射规则,再写一个遍历数据结构的引擎就是就解决了。原来的结构是 json 的,可以利用 jsonpath ,在结合业务自己优化优化 |
33 xiaobeitzb 2016-08-13 20:49:12 +08:00 大胆推测是为了把操作系统的树形结构路径,存到数据库(邻接表)里么? |
34 asuraa 2016-08-15 13:18:35 +08:00 尼玛能不能用 python3 |