一亩三分地

 找回密码 注册账号

扫描二维码登录本站

BBS
Offer多多
Salarytics
交友
Learn
Who's Hiring?
Visa Tracker
疫情动态
指尖新闻
Instant
客户端
微信公众号
扫码关注公众号
留学申请公众号
扫码关注留学申请公众号
Youtube频道
留学博客
关于我们
查看: 3796|回复: 22
收起左侧

[学Python/Perl] Coding也是有颜值的,刷题的时候保持颜值在线很重要

[复制链接] |只看干货 |学python/perl, 刷题
我的人缘0

升级   43.86%


分享帖子到朋友圈
本楼: 👍   75% (6)
 
 
25% (2)   👎
全局: 👍   93% (1223)
 
 
6% (89)    👎

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?注册账号

x

用Python实现一个简单的列表排序,相当于SQL order by 1 desc 2 asc

DE 3级coding水平(算法一般,颜值一般),为了使用 sort(key=lambda x: (-x[0], x[1])),蠢蠢的构建了一个新的列表。

[Python] 纯文本查看 复制代码
def frequency_sorting(numbers):
    list1 = []
    for num in numbers:
        list1.append([numbers.count(num),num])
    list1.sort(key=lambda x: (-x[0], x[1]))
    list2 = []
    for c in list1:
        list2.append(c[1])
    return list2


DE 4级coding水平(算法一般,颜值尚可),一样的算法和思路,美颜了一下,看着舒服了一些。

[Python] 纯文本查看 复制代码
def frequency_sorting(numbers):
    list1 = [[numbers.count(c),c] for c in numbers]
    list1.sort(key=lambda x: (-x[0], x[1]))
    return [item[1] for item in list1]


DE 5级coding水平(算法OK,颜值OK),为了实现多要素同时排序,不一定要构建新列表用sort(key=lambda x: (-x[0], x[1])),可以多重嵌套sorted(sorted(numbers), key=numbers.count, reverse=True),最外层的优先级最高,最里面的优先级最低。

[Python] 纯文本查看 复制代码
def frequency_sorting(numbers):
    return sorted(sorted(numbers), key=lambda x: numbers.count(x), reverse=True)


评分

参与人数 3大米 +13 收起 理由
jesshxh + 1 赞一个
lllllarissa + 2 很有用的信息!
14417335 + 10

查看全部评分


上一篇:119页 Cracking Java Interviews
下一篇:coursera上的一题,求大神指出错误
我的人缘0

升级   37.71%

daydream1 2020-8-7 13:07:13 | 显示全部楼层
本楼: 👍   100% (10)
 
 
0% (0)   👎
全局: 👍   99% (364)
 
 
0% (3)    👎
本帖最后由 daydream1 于 2020-8-7 13:47 编辑

numbers.count(x)的问题楼上都说了,你的最佳解实际上时间复杂度是n^2*logn。除此之外:
1. 像下面这样的one-liner牺牲了太多可读性。楼主还记得Python的设计哲学之一——可读性吧?业界也不鼓励可读性差的代码
[Python] 纯文本查看 复制代码
return sorted(sorted(numbers), key=lambda x: numbers.count(x), reverse=True)

2. 两个嵌套的sorted也不是相当于创建了两个lists吗?而且sorted(nums)的意义在于什么?浪费n*logn的时间复杂度,完全可以只用一个sorted解决。

如果让我来写:
[Python] 纯文本查看 复制代码
from Collections import Counter
def solution(nums):
    num_count = Counter(nums)
    return sorted(nums, key = lambda num: num_count[num], reverse = True)
    # 如果允许修改原本的nums,直接nums.sort() 也行        
    # 这道题我假设是保留重复的元素,实际面试时应当先clarify是否需要保留重复元素


补充:
楼主clarify题目以后,我发现sorted(nums)确实有意义,可以保留。如果不想排序两次可以通过别的一些方法来实现仅排序一次.

评分

参与人数 1大米 +1 收起 理由
李浩泉 + 1 欢迎继续点评

查看全部评分

回复

使用道具 举报

我的人缘0

升级   15.85%

wowmomsos 2020-8-7 10:50:41 | 显示全部楼层
本楼: 👍   100% (7)
 
 
0% (0)   👎
全局: 👍   86% (316)
 
 
13% (48)    👎
lambda x: numbers.count(x)

这一步是O(N). 性能不好。
正确的应该是 from collections import Counter
回复

使用道具 举报

我的人缘0

升级   2.83%

wangdiao01 2020-8-12 17:11:17 | 显示全部楼层
本楼: 👍   100% (5)
 
 
0% (0)   👎
全局: 👍   94% (3578)
 
 
5% (220)    👎
建议进一个大公司然后多参与几次3人以上的code review,
回复

使用道具 举报

我的人缘0

升级   43.86%

 楼主| 李浩泉 2020-8-7 04:02:28 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   93% (1223)
 
 
6% (89)    👎
本帖最后由 李浩泉 于 2020-8-7 04:59 编辑

DE日常最重要的工作就是数据清理,如何清理一个列表呢?

3级的coding:(硬干,全部转换成字符串,然后把‘[’,']',空格,都删掉,然后把剩下的数字装入新列表)

[Python] 纯文本查看 复制代码
def flat_list(array):
    list1 = str(array).replace('[','').replace(']','').replace(' ','').split(',')
    if len(list1) == 0 or list1 == ['']: return []
    list2 = []
    for c in list1:
        if c != '':
            list2.append(int(c))
    return list2

if __name__ == '__main__':
    assert flat_list([1, 2, 3]) == [1, 2, 3], "First"
    assert flat_list([1, [2, 2, 2], 4]) == [1, 2, 2, 2, 4], "Second"
    assert flat_list([[[2]], [4, [5, 6, [6], 6, 6, 6], 7]]) == [2, 4, 5, 6, 6, 6, 6, 6, 7], "Third"
    assert flat_list([-1, [1, [-2], 1], -1]) == [-1, 1, -2, 1, -1], "Four"
    print('Done! Check it')



6级的coding:(首先颜值在线,递归算法高级,SUM()巧妙实现列表的拼接)

[Python] 纯文本查看 复制代码
def flat_list(array):
    return sum(([x] if type(x) != list else flat_list(x) for x in array),[])


回复

使用道具 举报

我的人缘0

升级   43.86%

 楼主| 李浩泉 2020-8-7 05:04:21 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   93% (1223)
 
 
6% (89)    👎
关于列表排序的终极总结

[Python] 纯文本查看 复制代码
array = [[1,4,3],[2, 2, 2],[1,4,1]]

def flat_list(array):
    
    return sorted(array,key = lambda x:(x[1],-x[0],x[2]))

    return sorted(sorted(sorted(array),key=lambda x:x[0],reverse=True),key=lambda x:x[1])


print(flat_list(array))

[[2, 2, 2], [1, 4, 1], [1, 4, 3]]

回复

使用道具 举报

我的人缘0

升级   43.86%

 楼主| 李浩泉 2020-8-7 05:26:58 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   93% (1223)
 
 
6% (89)    👎
对字典类型的原始数据进行清理

You are given a dictionary where the keys are strings and the values are strings or dictionaries. The goal is flatten the dictionary, but save the structures in the keys. The result should be the a dictionary without the nested dictionaries. The keys should contain paths that contain the parent keys from the original dictionary. The keys in the path are separated by a "/". If a value is an empty dictionary, then it should be replaced by an empty string (""). Let's look at an example:

{
    "name": {
        "first": "One",
        "last": "Drone"
    },
    "job": "scout",
    "recent": {},
    "additional": {
        "place": {
            "zone": "1",
            "cell": "2"}
    }
}

The result will be:

{"name/first": "One",           #one parent
"name/last": "Drone",
"job": "scout",                #root key
"recent": "",                  #empty dict
"additional/place/zone": "1",  #third level
"additional/place/cell": "2"}

Input: An original dictionary as a dict.

Output: The flattened dictionary as a dict.

Example:

flatten({"key": "value"}) == {"key": "value"}
flatten({"key": {"deeper": {"more": {"enough": "value"}}}}) == {"key/deeper/more/enough": "value"}
flatten({"empty": {}}) == {"empty": ""}

我这方法能达到4.5级了吗?

[Python] 纯文本查看 复制代码
def flatten(dictionary):    
    dic = {}
    for key in dictionary.keys():
        if type(dictionary[key]) is str:
            dic[key] = dictionary[key]
        elif len(dictionary[key])==0:
            dic[key] = ''
        else:
            item = flatten(dictionary[key])
            for x in item:
                dic[key+'/'+x] = item[x]
    return dic


回复

使用道具 举报

我的人缘0

升级   43.86%

 楼主| 李浩泉 2020-8-7 07:15:19 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   93% (1223)
 
 
6% (89)    👎
本帖最后由 李浩泉 于 2020-8-7 07:55 编辑

掌握了sum()列表合并叠加,就可以不用办法了。

[Python] 纯文本查看 复制代码
    list1 = []
    for x in array:
        if type(x) != list:
            list1.append(x)
        else:
            list1.extend(flat_list(x))
    return list1
 
    return sum(([x] if type(x) != list else flat_list(x) for x in array),[])

又找了一个7级的大神过来看,5级是Senior可以干到退休的那种,6级是经理,7级是staff engineer有人事决定权的总监了。7级说,3级的算法思路可以,但是需要美颜。

3级原始代码

[Python] 纯文本查看 复制代码
def flat_list(array):
    list1 = str(array).replace('[','').replace(']','').replace(' ','').split(',')
    if len(list1) == 0 or list1 == ['']: return []
    list2 = []
    for c in list1:
        if c != '':
            list2.append(int(c))
    return list2


在3级的算法思路上,7级稍稍开了美颜之后的样子,瞬间不一样了。会用import,比会用sum(),感觉更高级。

[Python] 纯文本查看 复制代码
import re

def helper(a):
    return [int(x) for x in re.findall(r'\d+',str(a))]


4 - 5 级代码

[Python] 纯文本查看 复制代码
list1 = []
for x in array:
    if type(x) != list:
        list1.append(x)
    else:
        list1.extend(flat_list(x))



6 级代码

[Python] 纯文本查看 复制代码
def helper(a):
    return sum(([x] if type(x) != list else helper(x) for x in a),[])




回复

使用道具 举报

我的人缘0

升级   43.86%

 楼主| 李浩泉 2020-8-7 08:53:04 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   93% (1223)
 
 
6% (89)    👎
本帖最后由 李浩泉 于 2020-8-7 08:55 编辑

趁热打铁,出一道题:

c = [1,2,3,4]
d = [4,1,3,2] # c数列中的数值在output新数列中出现的次数。

output:[1, 1, 1, 1, 2, 3, 3, 3, 4, 4]

[Python] 纯文本查看 复制代码
def helper(c,d):
    return sum(([x]*y for x,y in zip(c,d)),[])


回复

使用道具 举报

我的人缘0

升级   43.86%

 楼主| 李浩泉 2020-8-7 11:42:22 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   93% (1223)
 
 
6% (89)    👎
本帖最后由 李浩泉 于 2020-8-7 11:44 编辑

再来一道,7级的DE说,10分钟搞定这道题,就可以通过5级DE的VO Coding部分。

You have a set of "words", all in lower case, and each word contains symbols in "alphabetical order". (it's not your typical alphabetical order, but a new and different order.) We need to determine the order of the symbols from each "word" and create a single "word" with all of these symbols, placing them in the new alphabetial order. In some cases, if we cannot determine the order for several symbols, you should use the traditional latin alphabetical order. For example: Given words "acb", "bd", "zwa". As we can see "z" and "w" must be before "a" and "d" after "b". So the result is "zwacbd".

Input: Words as a list of strings.

Output: The order as a string.

Example:

checkio(["acb", "bd", "zwa"]) == "zwacbd"
checkio(["klm", "kadl", "lsm"]) == "kadlsm"
checkio(["a", "b", "c"]) == "abc"
checkio(["aazzss"]) == "azs"
checkio(["dfg", "frt", "tyg"]) == "dfrtyg"

我现在的代码写的有点模样了吧?!
[Python] 纯文本查看 复制代码
def checkio(data):
    letters = sorted(list(set(sum((list(x) for x in data),[]))))
    new_data = ''
    for c in letters:       
        for item in letters:                  
            if item not in new_data and all(item not in word or item == word[0] for word in data):                        
                new_data += item
                for i in range(len(data)):  
                    data[i] = data[i].replace(item, '')
                break                   
    return new_data
                    
    

#These "asserts" using only for self-checking and not necessary for auto-testing
if __name__ == '__main__':
    assert checkio(["acb", "bd", "zwa"]) == "zwacbd", \
        "Just concatenate it"
    assert checkio(["klm", "kadl", "lsm"]) == "kadlsm", \
        "Paste in"
    assert checkio(["a", "b", "c"]) == "abc", \
        "Cant determine the order - use english alphabet"
    assert checkio(["aazzss"]) == "azs", \
        "Each symbol only once"
    assert checkio(["dfg", "frt", "tyg"]) == "dfrtyg", \
        "Concatenate and paste in"




回复

使用道具 举报

我的人缘0

升级   0%

NJESSICA11 2020-8-7 12:33:34 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (1)
 
 
0% (0)    👎
插眼插眼插眼插眼插眼插眼插眼mark
回复

使用道具 举报

我的人缘0

升级   79.86%

idealmaster 2020-8-7 12:45:46 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   98% (290)
 
 
1% (4)    👎
看到numbers.count(num)就笑了,但再一看是3级,想着原来是要给后面留空间
但看到最后还是numbers.count(num),这是在黑DE?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

隐私提醒:
■为防止被骚扰甚至人肉,不要公开留微信等联系方式,请以论坛私信方式发送。
■特定版块可以超级匿名:https://pay.1point3acres.com/tools/thread
■其他版块匿名方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

手机版|||一亩三分地

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

Some icons made by Freepik from flaticon.com

快速回复 返回顶部 返回列表