2015-04-27 58 views
-1

我在做python在线课程。 约章“采取降”左2个例子:Python采取下降(练习)

def take(num, lyst): 
    rlist = [] 
    for i in range(0,num): 
     rlist.append(lyst[i]) 
    return rlist 

def drop(num, lyst): 
    rlist = [] 
    for i in range(num, len(lyst)): 
     rlist.append(lyst[i]) 
    return rlist 

names = ['Raymond','Cynthia','David','Jennifer','Clayton'] 
somenames = take(3,names) 
print(somenames) 
names = drop(3,names) 
print(names) 

作为练习我不得不重写代码,以便将与负参数上班数字(-3)。

我想出了这个代码:

def take(num,lyst): 
    rlist=[] 
    if num>0: 
     for i in range(0,num): 
      rlist.append(lyst[i]) 
    else: 
     for i in range(len(lyst)-abs(num),len(lyst)): 
      rlist.append(lyst[i]) 
    return rlist 

def drop(num,lyst): 
    rlist=[] 
    if num>0: 
     for i in range(num,len(lyst)): 
      rlist.append(lyst[i]) 
     return rlist 
    else: 
     for i in range(len(lyst)-abs(num),len(lyst)): 
      rlist.append(lyst[i]) 
     return rlist 

但我认为它不够有效,这将是更好的建议。 编辑:修改的功能也应该向后工作。例如:take(-3,名称)将从最后3个

+0

那么,'take(-3,names)'和'drop(-3,names)'的结果是什么?你的代码是否已经产生了正确的结果? –

+0

修改过的函数也应该向后工作。例如:take(-3,names)从上次开始将需要3个工作,但它正在寻找更好的代码 – shotex

+2

*“我认为它效率不够高” - - 基于什么?是否有一些性能问题(内存?CPU?是否分析了它?)您能否扩展您的效率标准?如果这是你认为可以改进的**工作代码**,请考虑http://codereview.stackexchange.com,但我建议你阅读并遵循[风格指南](http://www.python.org/) dev/peps/pep-0008 /)作为第一个停靠港。 – jonrsharpe

回答

2

性能方面,你的代码应该没问题,因为它在任何情况下只能通过列表一次。如果你正在寻找一个更清洁或更优雅的方式,我有两个建议:

  • 使用列表内涵,而不是循环
  • take来定义的drop“负”的情况下,反之亦然

示例take

def take(num, lst): 
    if num > 0: 
     return [lst[i] for i in range(0, min(num, len(lst)))] 
    else: 
     return drop(max(len(lst) + num, 0), lst) 

逆,drop,留给读者作为练习至t他是读者。