2012-05-02 5 views
1

リスト内の要素を数えます紫色と黒色が一緒に発生しましたefficientyは、私がリストを持っている

栗色と紫色が何度起こったか。

など。 color_listの色は、定義済みの色から来ています。 つまり、私は色のリスト['red'、 'green'、 'teal' ....] を持っていると仮定し、基本的に赤と緑が一緒に "n"回color_list一緒に赤と青は一緒に "m"時間.. など..

そして、次のステップは何回赤、緑、青..を見つけることです(一度に3を取る)...

これをPythonで実装する最も良い方法は何ですか?

+1

私は4「マルーン」とリストと(color_list' 'の最初の要素のような)一つの「黒」は「黒と栗色が一緒に起こることを一回」とカウントし、それを取ります。 – flies

+0

@Lattyware:ネストされた辞書を維持している単純なリストを試しました。ネストは、私が数えているペアの数に依存します。だから、d ["red"] ["green"]私に番号を与えるだろう..しかし、3つの事柄を追跡するための別の方法..そして4つの事柄を追跡するための別の方法を..私は何度も何度も何度もやり直しています。これは非常に効率的です。 – Fraz

+0

@ Lattyware:同じリストにあるのは、2倍にカウントされます(そして1つではありません)。 – Fraz

答えて

6

コレクションを使用できます。カウンター:

color_list = [           
['black', 'maroon', 'maroon', 'maroon', 'maroon'] , 
['purple', 'black', 'maroon', 'maroon', 'maroon'] , 
['maroon', 'purple', 'maroon', 'teal', 'teal']  , 
['maroon', 'maroon', 'purple', 'maroon', 'maroon'] , 
['teal', 'olive', 'teal', 'maroon', 'maroon']   
]              

from collections import Counter 

cnt = [Counter(x) for x in color_list] 

for x, y in [('black', 'maroon'), ('teal', 'olive')]: 
    print x, y, sum(min(c[x], c[y]) for c in cnt) 
+0

+1 - これは、2つのオカレンスとしてカウントするために2つのペアが必要な場合のより良いソリューションです。 –

+0

カウンタはバージョン2.7で導入されました。 – fabrizioM

3

「一緒に」あなたは1を意味するサブリストに出現の任意の数を取ることを仮定:

color_sets = [set(sublist) for sublist in color_list] 
looking_for = {"maroon", "black"} 
sum(looking_for <= sublist for sublist in sublist) 

これは、加算、looking_forがセットのサブセットであるかどうかをチェックする、その後、セットにあなたのリストを作ることによって動作しますその結果(Trueは、整数として1とカウントされます)。

編集:

ちょうどあなたが出現数が問題にしたいんと言って、あなたのコメントを見

。その場合は、その後、私が持っていたものの簡単な適応がある。しかし

sum(min(sublist.count(item) for item in looking_for) for sublist in color_list) 

list.count()はあまり使用されているように、これは大きなlooking_forのために非常にefficentではありません。

+0

私はpythonの専門家ではありませんが、あなたはあなたの恋人の中で6つの一致としてカウントされませんでしたか?[黒、黒、栗色、栗色、栗色] – flies

+0

@flies私はそう信じていません、なぜあなたはそれがどうなると思いますか? –

+0

私はほとんどPythonを読むことができます。あなたが正しい。 :X – flies

1

実際には、指定されたリストから作成できるすべての色の組み合わせを探しているようです。私は離れているかもしれませんが、それがあなたの目標であれば、それは簡単な問題です。ユニークなアイテムをセットで取得し、リストの長さを合計するだけです。これは、順序が重要でないペアを見つけるための標準的なソリューションです。あなたが4のリスト、例えば0の中の最も左の要素から始めるなら、それは対になることができる3つの項目があります。インデックス1に移動すると、すでにインデックス0のペアがカウントされているため、右側に2つのアイテムがペア設定されます。

sum(xrange(0, len(set(colors) & set(chosen_colors))-1)) 

P.S.:Pythonでこれを行う簡単な方法は、あなたがあなたの内の任意のリストのペアを見つける必要がある特定の色を持っている場合、それは同様に簡単ですただ

sum(xrange(0, len(set(colors))-1)) 

ですset instersection kicks ass

+0

「黒」、「黒」、「栗色」、「栗色」、「栗色」」は2つの黒色/栗色のペアとしてカウントされるので、目的はすべての組み合わせを見つけるだけでなく、あなたは特定の方法で見つける。 – flies

+0

@flies十分に公正で、私が答えを書いたときにはっきりしなかった。私の最初の数の文章は、当時の私の問題の解釈についての免責事項です。 – Endophage

関連する問題