1 から 100 までのリストを反復処理するにはどうすればよいでしょうか。ここでは、最初の要素から始まる他のすべての要素を削除し、リストに 1 つの要素だけが残るまでその手順を繰り返します。循環リンクリストを使用する必要がありますか?それとも、ループと条件ステートメントを使用するだけで実行できますか?
7 に答える
これにより、残りの要素が1つだけになるまで、他のすべての要素が繰り返し削除されます
>>> 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によって正確に文書化されている場合は、ニブラーの答えを見てください。
この回答は、保持したいアイテムを追加し続けるだけです
>>> 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
deque を使用したメモリ効率の高いバージョン
>>> from collections import deque
>>> L = deque(range(100))
>>> while len(L) > 1:
... _ = L.popleft()
... L.append(L.popleft())
...
>>> L
deque([71])
これらはすべて71の値を示しますが、これは@ysakamotoの回答と一致しません
ネストされた2つの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]