使用过两门以上编程语言;至少精通一门编程语言
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 2
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
|