2012-05-03 7 views
2

リストから要素を取り出す:おそらく非常に素朴な疑問のpython

は私がリストを持っている:

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"] 

Eh。なぜこれはかなり簡単であると感じるのですか?これを解決できる1行のコマンドがおそらくありますか? ありがとう

+0

list.pop()をお探しですか?リストから1つの項目を削除して返します。 –

答えて

-2
for idx, item in enumerate(color): 
    print 'I am %s' % item 
    rest = color[:idx] + color[idx+1:] 
    print 'Rest is %s' % ','.join(rest) 
+0

-1 @spinlokスライスが遅すぎます。 –

+0

@AshwiniChaudhary、そうではありません。私は不正確な知識に基づいてダウンボウイングをしません。 – spinlok

+0

あなたのソリューションは '' + ''を使って2つのリストを追加しているので、あなたの解決策は遅いです。私は 'timeit'モジュールを使ってそれを計時しました。 –

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() Python 2.xの場合、zip()は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()の入力を逆に - あなたは左への権利を取得する代わりにzip()colorを逆にすることができます。

つまり、一言で言えば、それは1行の解決策です(インポートを数えれば2つです)。

+0

'combinations()'の現在の実装は、予測可能な順序を与えるかもしれませんが、将来の実装で同じままにすることには依存しません。 – spinlok

+1

@spinlok *の組み合わせの順序は保証されています。 –

+1

@spinlok関数の[文書化された機能](http://docs.python.org/library/itertools.html#itertools.combinations)です。変更するためには大きな変更になります。 –

0

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

done = [] 
for c in color: 
    if c in done: 
     continue 
    done.append(c) 
    print c 
+0

-1質問を正しく読んでください。 –

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'] 

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

+0

-1スライシングはこれを行うより簡単な方法ですが、遅くなります。 –

+1

@AshwiniChaudhary実際には、リストを構築する他の方法(list(s)、l.extend(s)、l [:] = sのコードの大部分は同じ基礎コード)より速くまたは高速にスライスします。また、スライスは、サイズ変更が不要になるようにターゲットリストのサイズを事前に設定します。 IOW、マイナス1は不当なものではなく、単に間違っているだけです。 –

+0

申し訳ありませんが、私が言っているのはスライシングが簡単ですが、 '+'を使って2つのリストを追加しているためにあなたのソリューションが遅いということです。 –

1

これはまた、重複を除いリストを返します

for i in range(len(yourlist)): 
    newlist = yourlist[:i] + yourlist[i:] 
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ループより効率的です。

関連する問題