推荐学习书目
› 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 · Aug 11, 2016 · 8033 views
    This topic created in 3738 days ago, the information mentioned may be changed or developed.

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

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

    }

    Supplement 1  ·  Aug 13, 2016
    补充一下我们的情况吧,项目是去年底启动的, 3 月份发布测试版, 5 月份上线第一个用户。做的是面向企业后端的 SaaS 应用,主要针对电商企业的仓库管理效率,算是企业效率工具类的软件。技术是 Python+AngularJS ,做了自动化测试看板,目前每周迭代,计划在 Q4 下轮融资,期待与大家共同实现梦想!
    由于产品后台的业务逻辑较复杂,所以后端人员需求更多一些,诚招 Python 各级别程序员,包括联合创始人!
    34 replies  •  2016-08-15 13:18:35 +08:00
    Harveyguo
    Harveyguo
    OP
    Aug 11, 2016
    1
    公司网址 http://www.vwms.cn ;天使轮;目前团队不到 20 人,产品 5 月份上线,已有 5 家企业用户;其他情况欢迎来电来函咨询。
    yuku
    yuku
    Aug 11, 2016 via iPhone
    2
    以前听说面试时帮对方解决问题?
    wd85318
    wd85318
    Aug 11, 2016
    3
    这个应该就是帮忙解决问题了
    @yuku
    fuling
    fuling
    Aug 11, 2016
    4
    @yuku :/ 你这么一说,后面都没人回复 LZ 了
    cxyfreedom
    cxyfreedom
    Aug 11, 2016
    5
    如果考虑到不同型的 dict ,范例输出的 lines 不是还没有完全扁平吗
    qianbaooffer
    qianbaooffer
    Aug 11, 2016
    6
    boss 值聘上好像聊过
    luluuulu4848
    luluuulu4848
    Aug 11, 2016
    7
    @yuku 同感。。。
    Harveyguo
    Harveyguo
    OP
    Aug 11, 2016
    8
    额~你这个顾虑怎么解决呢?把我们 3 月份实现的这段代码发上来?
    luluuulu4848
    luluuulu4848
    Aug 11, 2016
    9
    @yuku 这一看就是公司业务上的需求
    shyling
    shyling
    Aug 11, 2016
    10
    {aA:{bB:c}}变为{aa_bb:c}然后再根据情况去掉前缀 /删掉不需要的
    Harveyguo
    Harveyguo
    OP
    Aug 11, 2016
    11
    @yuku @luluuulu4848 @wd85318 各位大牛,如果真的需要解决这个问题,那会直接把这个问题发上来求教的, Python 开源社区这么多,有必要用这种方式解决实际的业务问题吗?如果连这个问题都需要用这种方式来解决,那我的 CTO 就可以直接洗洗睡了……
    之所以用实际的业务问题是希望面试者没有地方去搜索答案而已,如果各位有更好的题目或者方式,欢迎赐教。
    hitmanx
    hitmanx
    Aug 11, 2016
    12
    这种拿关键字一搜就有了,我能想到的关键字
    "python nested dictionary flatten"

    然后就看到了 SO 上例如
    http://stackoverflow.com/questions/6027558/flatten-nested-python-dictionaries-compressing-keys
    好像还有个库
    https://pypi.python.org/pypi/flatdict
    等等,都没点进去细看。
    Magic347
    Magic347
    Aug 11, 2016
    13
    dfs 可解
    domty
    domty
    Aug 11, 2016
    14
    这个很难吗?
    感觉就是把一个多层的树遍历出来成为一个集合。
    但是为什么后面的
    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
    Yinz
    Aug 11, 2016
    15
    纯好奇,说一下我的思路看看: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
    hitmanx
    Aug 11, 2016
    16
    对的,就是一棵多叉树遍历, dfs 就行。
    vnady
    vnady
    Aug 11, 2016
    17
    这种招聘挺好的,节约彼此的时间。比直接面试靠谱。
    mymike
    mymike
    Aug 11, 2016
    18
    映射并存储字段名称
    guyskk
    guyskk
    Aug 11, 2016
    19
    以前写过一个类似的,用递归实现。 https://github.com/guyskk/walkdict
    zhuangzhuang1988
    zhuangzhuang1988
    Aug 11, 2016
    20
    不错 不错, 薪资不错。。
    WinterWu
    WinterWu
    Aug 11, 2016 via iPhone
    21
    题目中写了字段名可能不同,因此总要用某种表。 1 ,直接将源 dict 字段和目标字段构建一个 dict , 2 ,抽象出规则,将无法用规则表达的用额外 dict 实现。具体到怎么扫描整个 dict 这个最简单就是迭代轮询,也可以用各种算法。
    但是,这个题目没说清楚最重要的问题:场景,数据量,表规模。场景:像这样的诉求我猜很可能在数据库中转换数据存储方式,那就应该直接使用数据库自身功能实现,比如 mongo agg 处理。数据量:少量数据情况下根本不值得写什么库,极大数据量情况下用 python 可能也麻烦。当然实际中还要考虑很多其它因素。
    抛开上面的问题,只说题目,那直接写个 mapping 轮询就好了
    newghost
    newghost
    Aug 11, 2016 via iPhone
    22
    所以没事还是别发面试题了 这么多人 challenge
    owt5008137
    owt5008137
    Aug 11, 2016 via Android
    23
    https://github.com/xresloader/xresloader/blob/master/README.md
    是不是和我这个相反?结构化转非结构化不要太简单。
    扁平化的数据转树形结构才麻烦
    likuku
    likuku
    Aug 11, 2016
    24
    技术都可以学习培养,由解题所无法获知的另一些非技术面的信息反而在工作中更重要吧
    IMRES
    IMRES
    Aug 11, 2016 via iPhone
    25
    喜欢这样的招聘帖,直接
    garytqq
    garytqq
    Aug 12, 2016
    26
    感觉很像这个东西完成的功能: from flask_restful import marshal

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