2017-08-24 4 views
1

リスト内のさまざまな項目の数を辞書に取り込みたいが、カウントが特定の数を超えている場合のみ。例えばカウントがしきい値を超えたときの辞書の理解の中のPythonカウント要素

(これは、Python 2.7である):私は2回以上表示される数字をしたい場合は

x = [2,3,4,2,3,5,6]、私だけ d = {2: 2, 3: 2}出力としてをしたいと思います。

私は、例えば

{(num if x.count(num) >= 2): x.count(num) for num in x} 

、辞書理解でこれをやってみたかった。しかし、これは「無効な構文」エラーをスローし、そして私はいくつかの重要なIドンを意味し、いくつかのデフォルトのキーを設定する必要がありそうです私はそれから削除する必要がある辞書に追加されたくない。

私が今やっていることは2行である:

d = {(num if x.count(num) >= 2 else None): x.count(num) for num in x} 

d.pop(None, None) 

しかし、一つでそれを行うために、あるいは実際のための任意のデフォルトのキーを追加することなく、if文で辞書理解を行うための方法がありますelseステートメント?

答えて

0

式のテスト:(num if x.count(num) >= 2 else None)が遅すぎます.dict compに値を発行するよう指示しました。あなたはあらかじめそれをフィルタリングしなければなりません。

だけ理解のフィルター部に三元から条件を移動:

x = [2,3,4,2,3,5,6] 
d = {num: x.count(num) for num in x if x.count(num) >= 2} 

それは二度の要素をカウントしているため、この方法は、非常に効果的ではない、と述べました。

フィルタ代わりCounter

import collections 

d = {num:count for num,count in collections.Counter(x).items() if count>=2} 
3

使用Counterカウントがより大きいか、閾値に等しいそれらの値(例えば2)を引っ張るために辞書理解、xで使用する各アイテムをカウントします。作品

from collections import Counter 

x = [2, 3, 4, 2, 3, 5, 6] 
threshold = 2 
c = Counter(x) 
d = {k: v for k, v in c.iteritems() if v >= threshold} 
>>> d 
{2: 2, 3: 2} 
1

:あなたは構文エラーを取得する理由

{ i: x.count(i) for i in x if x.count(i) >= 2} 

if部分はforた後でなければなりませんが、前ではなく、それはです。

二回カウント要素を回避するために、そして余分なインポートせずに、あなたはまた、ネストされた2つの内包表記(実際には内側のものは、二回の完全なリストを反復回避するための発電機である)使用することができます。これは動作するはず

>>> { j: n for j, n in ((i, x.count(i)) for i in x) if n >= 2} 
{2: 2, 3: 2} 
0

を:

a = [1,2,2,2,3,4,4,5,6,2,2,2] 
{n: a.count(n) for n in set(a) if a.count(n) >= 2} 
{2: 6, 4: 2} 
関連する問題