一道入群验证的Python题

一道入群验证的Python题

中午浏览知乎帖子,看到一个帖子在吵架(吵架是知乎的日常吗?),然后回复里不知咋地提到了一个Python群,要入群要做题验证。题目有点乱,我大概整理下如下:

实现groupBy函数。grpby = groupBy(lambda x: x%2 is 1)grpby([1, 2, 3])的结果为{True: [1, 3], False: [2]}这样。

想想好久没翻Python的“牌”了,手痒痒娱乐娱乐。因为在Notepad2里随便写的,Tab键就直接俩空格了,将就一下咯。

先是写了一个如下:

def groupBy(fn):
  def go(lst):
    m = {}
    for v in lst:
      m[fn(v)].append(v) if m.get(fn(v)) else m.update({fn(v): [v]})
    return m
  return go

grpby = groupBy(lambda x: x%2 is 1)
grpby([1, 2, 3])

再后面想想看可以用dict.setdefault()嘛:

def groupBy(fn):
  def go(lst):
    m = {}
    for v in lst:
      m.setdefault(fn(v), []).append(v)
    return m
  return go

grpby = groupBy(lambda x: x%2 is 1)
grpby([1, 2, 3])

再后面还有collections.defaultdict呢,collections.defaultdict的效率也比dict.setdefault()快一些哟:

from collections import defaultdict

def groupBy(fn):
  def go(lst):
    m = defaultdict(list)
    for v in lst:
      m[fn(v)].append(v)
    return dict(m)
  return go

grpby = groupBy(lambda x: x%2 is 1)
grpby([1, 2, 3])

可能还有更好的方式?

然后谈谈感想哈。

为嘛知乎上这么多一言不合就掀桌骂娘哪?哪个语言好、哪个语言不好,你自己觉得好不好就是了,管人家观点跟你一样不一样干嘛呢?呐,就算是要发表观点、要反驳观点,也不要讲阴损的话、骂人的话呀!今天回答了一个问题“为什么和BAT相比,网易的技术实力显得捉襟见肘?”,然后居然有人说“网易给你多少钱”?这特么蛋筒了吧?

呐,写程序呢,最重要是自己沉浸其中,心情愉悦轻松。你鄙视我、我鄙视你有必要吗?说实话编程语言又不是你姥姥姥爷,鸡冻个嘛球球呐?!

很多莫名其妙的人、很多莫名其妙的事儿......配上一幅“怒目金刚”的图!

编辑于 2017-09-26 16:21