2017-08-18 2 views
1

私の例(リストa、bは常に同じ大きさ):コードのみリストAを介して見えるようにここでPython 3.6 - それ以外の場合に動作する条件はありますか?

a = ['12','12','12','12','12','23','24','24','31','31'] 
b = ['1','2','2','2','2','2','5','5','5','5'] 
c = a, b 

は、そうでない状態のようなものを必要とする私のコード、C [0]です両方のリストではなく、条件に適合するリストaとbの結果を表示します。 このコードで他の条件が間違っていると私は代替を考えるカント:

d = list(zip(*[(ai,bi) for ai, bi in zip(a,b) if c[0].count(ai) == 5 else 2])) 

e = list(zip(*[(ai,bi) for ai, bi in zip(a,b) if c[0].count(ai) == 7 else 2])) 

が、私の例では2つの以上のカウントがある場合、それは5のみカウントを出力するように条件を変更することは可能です?または、7が最初のカウントであっても検出されない場合は、2のカウントだけを出力しますか?

私の希望する結果:

d = [('12','12','12','12','12',), ('1','2','2','2','2')] 

e = [('24','24','31','31'), ('5','5','5','5')] 

ありがとうございます!

+0

なぜ 'C [0] .count(...)'あなただけの '' a.count(...)を行うことができますか? –

+0

'count()'を繰り返し呼び出すことは*高価です。最初に 'Counter()'を作成し、そのオブジェクトのインスタンスを使用してください。 –

+0

こんにちは私は、コードがリストを見て、5つの繰り返し番号がある場合のカウントを意味します。それがあれば、5つの数字が印刷されます。別のケースでは、7つの繰り返し番号があるかどうかを確認します。それがあればそれは7つの数字を印刷しますが、7がない場合は、2つのカウントを持つ数字だけが表示されます。 –

答えて

3

最初にを数え、次に選択するものを決定する必要があります。

from collections import Counter 

counts = Counter(a) 
has_5 = any(c == 5 for c in counts.values()) 
has_7 = any(c == 7 for c in counts.values()) 

今5回現れる要素がある場合は、あなたが知っている、と7回現れる要素がある場合:効率的要素をカウントするので、あなたが選んだことがあるかの要素を決定することができcollections.Counter() objectを使用します。これらの要素は、反復回数を数えることなく、何回表示するかによってフィルタリングできます。

5回、これらのフィルタを思わ要素があるので、 場合
desired_count = 5 if has_5 else 2 
d = list(zip(*[(ai,bi) for ai, bi in zip(a,b) if counts[ai] == desired_count])) 

desired_count = 7 if has_7 else 2 
e = list(zip(*[(ai,bi) for ai, bi in zip(a,b) if counts[ai] == desired_count])) 

が、そうでない場合にのみ表示される要素にフィルタを適用:あなたはifロジックを複雑にする必要はありませんので、あなたは、最初を選択してください二度。

デモ:

>>> from collections import Counter 
>>> a = ['12','12','12','12','12','23','24','24','31','31'] 
>>> b = ['1','2','2','2','2','2','5','5','5','5'] 
>>> counts = Counter(a) 
>>> has_5 = any(c == 5 for c in counts.values()) 
>>> has_7 = any(c == 7 for c in counts.values()) 
>>> desired_count = 5 if has_5 else 2 
>>> list(zip(*[(ai,bi) for ai, bi in zip(a,b) if counts[ai] == desired_count])) 
[('12', '12', '12', '12', '12'), ('1', '2', '2', '2', '2')] 
>>> desired_count = 7 if has_7 else 2 
>>> list(zip(*[(ai,bi) for ai, bi in zip(a,b) if counts[ai] == desired_count])) 
[('24', '24', '31', '31'), ('5', '5', '5', '5')] 
+0

助けと説明に感謝します。 –

+0

これにさらに条件を追加すると、else条件の前にelifを使用できますか? –

+0

@ F.Lee:いいえ、[条件式](https://docs.python.org/3/reference/expressions.html#conditional-expressions)には「elif」オプションがありません。それらを連鎖するか、完全な 'if .. elif .. else'ステートメントを使って展開してください。 –

関連する問題