创业团队诚招 Python 主程序员,坐标上海张江,此为初步面试题,待遇 20~40K,附期权

2016-08-11 15:56:39 +08:00
 Harveyguo

使用过两门以上编程语言;至少精通一门编程语言

2 年以上 Python 经验;或 5 年以上开发经验

如下面试题,如感兴趣可以将题目答案及简历发送至 register@vwms.cn 邮箱,期待与你的相遇!

有 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'
    }
],

}

6499 次点击
所在节点    Python
34 条回复
Harveyguo
2016-08-11 15:58:46 +08:00
公司网址 http://www.vwms.cn ;天使轮;目前团队不到 20 人,产品 5 月份上线,已有 5 家企业用户;其他情况欢迎来电来函咨询。
yuku
2016-08-11 16:01:44 +08:00
以前听说面试时帮对方解决问题?
wd85318
2016-08-11 16:03:32 +08:00
这个应该就是帮忙解决问题了
@yuku
fuling
2016-08-11 16:03:46 +08:00
@yuku :/ 你这么一说,后面都没人回复 LZ 了
cxyfreedom
2016-08-11 16:04:17 +08:00
如果考虑到不同型的 dict ,范例输出的 lines 不是还没有完全扁平吗
qianbaooffer
2016-08-11 16:04:35 +08:00
boss 值聘上好像聊过
luluuulu4848
2016-08-11 16:04:44 +08:00
@yuku 同感。。。
Harveyguo
2016-08-11 16:04:54 +08:00
额~你这个顾虑怎么解决呢?把我们 3 月份实现的这段代码发上来?
luluuulu4848
2016-08-11 16:05:22 +08:00
@yuku 这一看就是公司业务上的需求
shyling
2016-08-11 16:06:56 +08:00
{aA:{bB:c}}变为{aa_bb:c}然后再根据情况去掉前缀 /删掉不需要的
Harveyguo
2016-08-11 16:09:02 +08:00
@yuku @luluuulu4848 @wd85318 各位大牛,如果真的需要解决这个问题,那会直接把这个问题发上来求教的, Python 开源社区这么多,有必要用这种方式解决实际的业务问题吗?如果连这个问题都需要用这种方式来解决,那我的 CTO 就可以直接洗洗睡了……
之所以用实际的业务问题是希望面试者没有地方去搜索答案而已,如果各位有更好的题目或者方式,欢迎赐教。
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
等等,都没点进去细看。
Magic347
2016-08-11 16:51:34 +08:00
dfs 可解
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 ?
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
hitmanx
2016-08-11 17:51:29 +08:00
对的,就是一棵多叉树遍历, dfs 就行。
vnady
2016-08-11 19:47:43 +08:00
这种招聘挺好的,节约彼此的时间。比直接面试靠谱。
mymike
2016-08-11 20:08:31 +08:00
映射并存储字段名称
guyskk
2016-08-11 20:19:40 +08:00
以前写过一个类似的,用递归实现。 https://github.com/guyskk/walkdict
zhuangzhuang1988
2016-08-11 20:31:36 +08:00
不错 不错, 薪资不错。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/298680

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX