V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Harveyguo
V2EX  ›  Python

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

  •  1
     
  •   Harveyguo · 2016-08-11 15:56:39 +08:00 · 6483 次点击
    这是一个创建于 3030 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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 条附言  ·  2016-08-13 10:22:34 +08:00
    补充一下我们的情况吧,项目是去年底启动的, 3 月份发布测试版, 5 月份上线第一个用户。做的是面向企业后端的 SaaS 应用,主要针对电商企业的仓库管理效率,算是企业效率工具类的软件。技术是 Python+AngularJS ,做了自动化测试看板,目前每周迭代,计划在 Q4 下轮融资,期待与大家共同实现梦想!
    由于产品后台的业务逻辑较复杂,所以后端人员需求更多一些,诚招 Python 各级别程序员,包括联合创始人!
    34 条回复    2016-08-15 13:18:35 +08:00
    Harveyguo
        1
    Harveyguo  
    OP
       2016-08-11 15:58:46 +08:00
    公司网址 http://www.vwms.cn ;天使轮;目前团队不到 20 人,产品 5 月份上线,已有 5 家企业用户;其他情况欢迎来电来函咨询。
    yuku
        2
    yuku  
       2016-08-11 16:01:44 +08:00 via iPhone
    以前听说面试时帮对方解决问题?
    wd85318
        3
    wd85318  
       2016-08-11 16:03:32 +08:00
    这个应该就是帮忙解决问题了
    @yuku
    fuling
        4
    fuling  
       2016-08-11 16:03:46 +08:00
    @yuku :/ 你这么一说,后面都没人回复 LZ 了
    cxyfreedom
        5
    cxyfreedom  
       2016-08-11 16:04:17 +08:00
    如果考虑到不同型的 dict ,范例输出的 lines 不是还没有完全扁平吗
    qianbaooffer
        6
    qianbaooffer  
       2016-08-11 16:04:35 +08:00
    boss 值聘上好像聊过
    luluuulu4848
        7
    luluuulu4848  
       2016-08-11 16:04:44 +08:00
    @yuku 同感。。。
    Harveyguo
        8
    Harveyguo  
    OP
       2016-08-11 16:04:54 +08:00
    额~你这个顾虑怎么解决呢?把我们 3 月份实现的这段代码发上来?
    luluuulu4848
        9
    luluuulu4848  
       2016-08-11 16:05:22 +08:00
    @yuku 这一看就是公司业务上的需求
    shyling
        10
    shyling  
       2016-08-11 16:06:56 +08:00
    {aA:{bB:c}}变为{aa_bb:c}然后再根据情况去掉前缀 /删掉不需要的
    Harveyguo
        11
    Harveyguo  
    OP
       2016-08-11 16:09:02 +08:00
    @yuku @luluuulu4848 @wd85318 各位大牛,如果真的需要解决这个问题,那会直接把这个问题发上来求教的, Python 开源社区这么多,有必要用这种方式解决实际的业务问题吗?如果连这个问题都需要用这种方式来解决,那我的 CTO 就可以直接洗洗睡了……
    之所以用实际的业务问题是希望面试者没有地方去搜索答案而已,如果各位有更好的题目或者方式,欢迎赐教。
    hitmanx
        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
    等等,都没点进去细看。
    Magic347
        13
    Magic347  
       2016-08-11 16:51:34 +08:00
    dfs 可解
    domty
        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 ?
    Yinz
        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
    hitmanx
        16
    hitmanx  
       2016-08-11 17:51:29 +08:00
    对的,就是一棵多叉树遍历, dfs 就行。
    vnady
        17
    vnady  
       2016-08-11 19:47:43 +08:00
    这种招聘挺好的,节约彼此的时间。比直接面试靠谱。
    mymike
        18
    mymike  
       2016-08-11 20:08:31 +08:00
    映射并存储字段名称
    guyskk
        19
    guyskk  
       2016-08-11 20:19:40 +08:00
    以前写过一个类似的,用递归实现。 https://github.com/guyskk/walkdict
    zhuangzhuang1988
        20
    zhuangzhuang1988  
       2016-08-11 20:31:36 +08:00
    不错 不错, 薪资不错。。
    WinterWu
        21
    WinterWu  
       2016-08-11 21:35:59 +08:00 via iPhone
    题目中写了字段名可能不同,因此总要用某种表。 1 ,直接将源 dict 字段和目标字段构建一个 dict , 2 ,抽象出规则,将无法用规则表达的用额外 dict 实现。具体到怎么扫描整个 dict 这个最简单就是迭代轮询,也可以用各种算法。
    但是,这个题目没说清楚最重要的问题:场景,数据量,表规模。场景:像这样的诉求我猜很可能在数据库中转换数据存储方式,那就应该直接使用数据库自身功能实现,比如 mongo agg 处理。数据量:少量数据情况下根本不值得写什么库,极大数据量情况下用 python 可能也麻烦。当然实际中还要考虑很多其它因素。
    抛开上面的问题,只说题目,那直接写个 mapping 轮询就好了
    newghost
        22
    newghost  
       2016-08-11 22:35:17 +08:00 via iPhone
    所以没事还是别发面试题了 这么多人 challenge
    owt5008137
        23
    owt5008137  
       2016-08-11 22:43:37 +08:00 via Android
    https://github.com/xresloader/xresloader/blob/master/README.md
    是不是和我这个相反?结构化转非结构化不要太简单。
    扁平化的数据转树形结构才麻烦
    likuku
        24
    likuku  
       2016-08-11 22:46:22 +08:00
    技术都可以学习培养,由解题所无法获知的另一些非技术面的信息反而在工作中更重要吧
    IMRES
        25
    IMRES  
       2016-08-11 23:21:45 +08:00 via iPhone
    喜欢这样的招聘帖,直接
    garytqq
        26
    garytqq  
       2016-08-12 08:08:02 +08:00
    感觉很像这个东西完成的功能: from flask_restful import marshal

    数据是变化的, key/field 不变的话,建立源 key/field 到目标 key/field 的映射关系,使用上面的方法
    Harveyguo
        27
    Harveyguo  
    OP
       2016-08-12 12:04:42 +08:00
    @mymike 有兴趣交流下吗? [email protected]
    Harveyguo
        28
    Harveyguo  
    OP
       2016-08-12 16:58:10 +08:00
    各位大牛,有愿意找工作的吗?我该怎么联系你们呢?真急死我了。。。。
    补充一下我们的情况吧,项目是去年底启动的, 3 月份发布测试版, 5 月份上线第一个用户。因为是面向企业后端的 SaaS 应用,所以业务上的细节还是比较多,主要针对电商企业的仓库管理效率,算是企业效率工具类的软件。技术是 Python+AngularJS ,做了自动化测试看板,目前每周迭代,节奏还是比较快。计划在 Q4 下轮融资,期待与大家共同实现梦想!
    yutian2211
        29
    yutian2211  
       2016-08-12 17:11:51 +08:00
    。。。。。招聘网站
    daocloud
        30
    daocloud  
       2016-08-13 11:16:36 +08:00   ❤️ 2
    DaoCloud 发来贺电!
    dh7758
        31
    dh7758  
       2016-08-13 11:52:39 +08:00
    套路
    ntop
        32
    ntop  
       2016-08-13 20:35:13 +08:00
    任何发明新算法的都是耍流氓,这个很简单其实抽象出来就是一个爬虫的应用。输入的数据结构类似于一个网页,输出扁平化的结构类似于爬虫的结果,所以借鉴 XMLPath 的做法,定义映射规则,再写一个遍历数据结构的引擎就是就解决了。原来的结构是 json 的,可以利用 jsonpath ,在结合业务自己优化优化
    xiaobeitzb
        33
    xiaobeitzb  
       2016-08-13 20:49:12 +08:00
    大胆推测是为了把操作系统的树形结构路径,存到数据库(邻接表)里么?
    asuraa
        34
    asuraa  
       2016-08-15 13:18:35 +08:00
    尼玛能不能用 python3
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5458 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 07:31 · PVG 15:31 · LAX 23:31 · JFK 02:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.