4

1 から 100 までのリストを反復処理するにはどうすればよいでしょうか。ここでは、最初の要素から始まる他のすべての要素を削除し、リストに 1 つの要素だけが残るまでその手順を繰り返します。循環リンクリストを使用する必要がありますか?それとも、ループと条件ステートメントを使用するだけで実行できますか?

4

7 に答える 7

4

これにより、残りの要素が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]
于 2014-02-19T03:04:42.563 に答える
3

Python の便利なスライス構文を使用するのはどうですか:

while len(best_list_ever) > 1:
    best_list_ever = best_list_ever[1::2]

best_list_ever[1::2]は、元のリスト内の他のすべての要素のリストです。

編集:循環制約については実際にはかなり混乱していますが、ysakamotoによって正確に文書化されている場合は、ニブラーの答えを見てください。

于 2014-02-19T03:03:53.260 に答える
2

この回答は、保持したいアイテムを追加し続けるだけです

>>> 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の回答と一致しません

于 2014-02-19T04:42:58.370 に答える
0

ネストされた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 を残します

ありがとう!

于 2014-02-19T03:00:40.973 に答える
0

他の回答ほどコンパクトではありませんが、これが私のバージョンです。私は 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]
于 2014-02-19T03:27:39.233 に答える