2

おそらく非常に素朴な質問です:

私はリストを持っています:

color = ["red","blue","red","green","blue"]

今、私はリストを繰り返したい

for c in color:
   # color is "red"
     get the rest of the colors except this red
    so rest = ["blue","red","green",blue"]

次の反復で:

    c = blue
    rest = ["red","red","green","blue"]

ええ なぜこれを行うのは非常に簡単だと感じるのですか..そしてこれを解決できる1行のコマンドがあるのでしょうか?ありがとう

4

6 に答える 6

6

これを考える最も簡単な方法は、リストより1つ短い長さですべての組み合わせを反復処理することです。これを行うには、次を使用できますitertools.combinations()

import itertools

color = ["red","blue","red","green","blue"]

for rest in itertools.combinations(color, len(color)-1):
    print(rest)

それは私たちに与えます:

('red', 'blue', 'red', 'green')
('red', 'blue', 'red', 'blue')
('red', 'blue', 'green', 'blue')
('red', 'red', 'green', 'blue')
('blue', 'red', 'green', 'blue')

これは、シーケンスだけでなく反復可能オブジェクトでも機能し、非常に読みやすく、優れた高速であるため、優れたソリューションです。

現在の値も必要な場合はcombinations()、予測可能な順序で簡単に取得できるため、両方を同時に繰り返すだけzip()です(当然、最高のパフォーマンスが必要な場合は、itertools.izip()Python2.xで使用します。 aszip()はリストを作成しますが、3.xのようなジェネレーターではありません)。

import itertools

color = ["red","blue","red","green","blue"]

for c, rest in zip(color, itertools.combinations(reversed(color), len(color)-1)):
    print(c, rest)

red ('blue', 'green', 'red', 'blue')
blue ('blue', 'green', 'red', 'red')
red ('blue', 'green', 'blue', 'red')
green ('blue', 'red', 'blue', 'red')
blue ('green', 'red', 'blue', 'red')

ここでは、入力を逆にしてcomibinations()、左から右に機能するようにします。代わりに、右から左に逆colorにすることができます。zip()

つまり、そうです、要するに、これは1行のソリューションです(インポートを数えると2つです)。

于 2012-05-03T20:27:16.677 に答える
1

スライスして列挙すると、このタスクを簡単に実行できます。

>>> colors = ["red", "blue", "red", "green", "blue"]
>>> for i, color in enumerate(colors):
        rest = colors[:i] + colors[i+1:]
        print color, '-->', rest

red --> ['blue', 'red', 'green', 'blue']
blue --> ['red', 'red', 'green', 'blue']
red --> ['red', 'blue', 'green', 'blue']
green --> ['red', 'blue', 'red', 'blue']
blue --> ['red', 'blue', 'red', 'green']

列挙型は各色の位置を追跡し、スライスは色の前後のリストの部分を抽出します。

于 2012-05-03T20:38:23.817 に答える
1

これも機能するはずです

for i in range(len(yourlist)):
    newlist = yourlist[:i] + yourlist[i:]
于 2012-05-03T20:43:46.913 に答える
0

このPythonコードは、重複のない新しい出力リストを作成します。

done = []
for c in color:
    if c in done:
        continue
    done.append(c)
    print c
于 2012-05-03T20:27:30.243 に答える
0

次の例では、重複が削除されたリストが返されます。空のリターンリストから開始し、カラーリストをチェックします。色(この場合は赤)がすでに出力に含まれている場合は、無視されます。

#!/usr/bin/env python

color = ["red","blue","red","green","blue"]

def rem_dup(dup_list):
    corrected_list = []
    for color in dup_list:
        if color in corrected_list:
            continue
        else:
            corrected_list.append(color)

    return corrected_list

あなたはおそらく次のようなものを使用する方が良いでしょう

>>> set(color)
set(['blue', 'green', 'red'])
>>> 

また

>>> import collections
>>> color = ["red","blue","red","green","blue"]
>>> collections.OrderedDict.fromkeys(color)
OrderedDict([('red', None), ('blue', None), ('green', None)])
>>> 

重複を削除します。どちらもforループよりも効率的です。

于 2012-07-16T13:42:02.920 に答える
-2
for idx, item in enumerate(color):
    print 'I am %s' % item
    rest = color[:idx] + color[idx+1:]
    print 'Rest is %s' % ','.join(rest)
于 2012-05-03T20:28:33.880 に答える