Python取下(练习)

时间:2015-04-27 12:44:54

标签: python

我在做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,names)将从最后一次

获取3

2 个答案:

答案 0 :(得分:2)

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

  • 使用list-comprehensions而不是loop
  • 根据drop定义take的“否定”案例,反之亦然

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,留给读者练习。

答案 1 :(得分:0)

takedrop 通常一起用于获取切片,为此您可以直接使用 itertools.islice,但您仍然可以定义 take 和 {{1 }} 在 drop 方面:

islice

像这样使用它:

from itertools import islice

def take(count, it): 
    return islice(it, count)

def drop(count, it): 
    return islice(it, count, None) 

但是,在您的问题的上下文中,使用 >>> from itertools import count >>> mylist = list(take(10, drop(100, count()))) >>> mylist [100, 101, 102, 103, 104, 105, 106, 107, 108, 109] 是没有意义的,因为迭代器可能没有 end 的概念。例如,您不能从 islice 的末尾删除 3 个项目。

但是由于您将问题限制在列表中,列表具有切片操作:itertoos.cycle("abcd")

mylist[start:stop:step]

使用:

def take_list(count, lst):
    return lst[:count]

def drop_list(count, lst):
    return lst[count:]

但在这个定义中,>>> take_list(3, mylist) [100, 101, 102] >>> drop_list(3, mylist) [103, 104, 105, 106, 107, 108, 109] 做你想做的事情 take_list(-3, "abcdefg") 所以:

drop_list(-3, "abcdefg")

现在对于负 def neg_take_list(count, lst): return lst[count:] if count < 0 else lst[:count] def neg_drop_list(count, lst): return lst[:count] if count < 0 else lst[count:] 我们得到:

count

如果您打算让 >>> neg_take_list(-3, mylist) [107, 108, 109] >>> neg_drop_list(-3, mylist) [100, 101, 102, 103, 104, 105, 106] take 以相反的顺序为您提供项目,您可以使用 dropstep: (注意我们需要通过减少负 -1 来解决的一个问题)

count

注意我们需要通过递减负值 def rev_take_list(count, lst): return lst[:count-1:-1] if count < 0 else lst[:count] def rev_drop_list(count, lst): return lst[count-1::-1] if count < 0 else lst[count:] 来解决的逐一问题。

这里有负 count 我们得到:

count