我将如何遍历 1-100 的列表,从第一个元素开始删除所有其他元素,然后重复该步骤,直到列表中只剩下一个元素。我必须使用循环链表,还是只使用循环和条件语句来完成?
7 回答
这会一遍又一遍地删除所有其他元素,直到只剩下一个
>>> L = range(100) # for Python3, use L = list(range(100))
>>> while len(L) > 1:
... del L[::2]
...
>>> L
[63]
我不确定“循环列表”是什么意思,但也许需要这个修改
>>> L = range(100)
>>> while len(L) > 1:
... del L[len(L)%2::2]
...
>>> L
[99]
L的长度是否为奇数的len(L)%2
方法del L[1::2]
或者,如果您想看看发生了什么:
>>> L = range(100)
>>> while len(L) > 1:
... del L[len(L)%2::2]
... L
...
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
[3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, 67, 71, 75, 79, 83, 87, 91, 95, 99]
[3, 11, 19, 27, 35, 43, 51, 59, 67, 75, 83, 91, 99]
[3, 19, 35, 51, 67, 83, 99]
[3, 35, 67, 99]
[35, 99]
[99]
如何使用 Python 方便的切片语法:
while len(best_list_ever) > 1:
best_list_ever = best_list_ever[1::2]
该表达式best_list_ever[1::2]
是原始列表中所有其他元素的列表。
编辑:我实际上对循环约束的事情很困惑,但如果 ysakamoto 准确地记录了它,那么也许可以看看 gnibbler 的答案。
这个答案只是不断附加您希望保留的项目
>>> from itertools import islice
>>> L = range(100)
>>> for i in islice(L, 1, None, 2):
... L.append(i)
...
>>> i
71
等效地不使用 islice
>>> L = range(100)
>>> i = 1
>>> while i < len(L):
... L.append(L[i])
... i += 2
...
>>> L[-1]
71
使用双端队列的内存高效版本
>>> from collections import deque
>>> L = deque(range(100))
>>> while len(L) > 1:
... _ = L.popleft()
... L.append(L.popleft())
...
>>> L
deque([71])
这些都给出了 71 的值,这与@ysakamoto 的回答不符
如果假设循环列表结构,当列表的最后一个元素被删除时,下一个要删除的元素不再是剩余列表中的第一个,而是第二个。因此,
L = range(100)
st1=len(L)%2
st2=0
while len(L)>1:
del L[st2::2]
st2=(st1+st2)%2
st1=len(L)%2
print L
应该是正确的。
结果是
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
[3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, 67, 71, 75, 79, 83, 87, 91, 95, 99]
[7, 15, 23, 31, 39, 47, 55, 63, 71, 79, 87, 95]
[7, 23, 39, 55, 71, 87]
[7, 39, 71]
[7, 71]
[71]
你可以用两个嵌套的while循环来做到这一点
pseudo code
// if there is more than one element, lets keep working
while(list.size > 1) {
// Know there is one element, thus safe to assume 0
int i = 0;
// retrieve list size, going to be mutating list
int l = list.size
// iterate through list
while(i < l) {
// delete element, we want to delete the next element but skip previous, thus floor / 2
list.delete(floor(i / 2));
// skip every other element, thus increment by 2
i = i + 2;
}
}
for 循环或任何迭代循环也可以做到这一点。如果您在执行此操作时打印元素,您应该会看到按顺序删除的元素(假设列表大小为 10)
循环 1 0,2,4,6,8
循环 2 1,5,9
循环 3 3
将原始列表中的元素 7 留给您
谢谢!
虽然不像其他答案那么紧凑,但这是我的版本。我是 Python 新手,通过查看其他人的答案学到了很多东西。
mylist = range(20)
print mylist
while len(mylist) > 1:
for i in range(len(mylist) / 2):
del mylist[i]
print mylist
结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
[3, 7, 11, 15, 19]
[7, 15, 19]
[15, 19]
[19]
长代码:
num=int(input())
list_num=[]
for j in range(num):
list_num.append(j+1)
k=0
while len(list_num)>1:
new_list_sum=[]
l=0
while k+2*l<len(list_num):
new_list_sum.append(list_num[k+2*l])
l=l+1
if (k+2*l)%(len(list_num)-1)==1:
k=0
else:
k=1
list_num=new_list_sum[:]
print(list_num)
print(list_num[0])
短代码:
num=int(input())
l=num-2**(len(bin(num)[2:])-1)
print (2*l+1)