我在做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答案 0 :(得分:2)
在性能方面,您的代码应该没问题,因为在任何情况下它只会通过列表。如果您正在寻找更清洁或更优雅的方式,我有两个建议:
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)
take
和 drop
通常一起用于获取切片,为此您可以直接使用 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
以相反的顺序为您提供项目,您可以使用 drop
的 step
:
(注意我们需要通过减少负 -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