0

私のコードは次のようなものです:

d = defaultdict(list)
for prod_no ,production in enumerate(productions):
    cp = Production(*productions[prod_no])
    count_yields = len(cp.pattern_list())
    #temp.setdefault(temp[cp.lhs()], []).append(count_yields)
    d[cp.lhs()].append(count_yields)

print d

出力として、以下のようなものを取得しています。

defaultdict(<type 'list'>, {'A': [3, 3, 4, 3], 'S': [1], 'B': [4,5]})

キー 'A' には 3 と 4 のように異なる複数の値があるため、エラーを報告する必要があります。キー 'B' についても同じことが言えます。

次のような出力が得られた場合、エラーは発生しないはずです

defaultdict(<type 'list'>, {'A': [3, 3, 3, 3], 'S': [1]})

「A」と「S」の両方が同じ値を持っているため...

4

4 に答える 4

2

リスト内の重複をチェックしたい場合 (タイトルに従って)、それをセットに変換し、その長さ (この場合は 1) をチェックすることができます:

if not all(len(set(items))==1 for items in d.values()):
    #A list against some key does not have all-same elements.
于 2012-07-28T14:38:55.053 に答える
2

値を重複させたくない場合は、リストの代わりにセットを辞書の値として使用する必要があります。いずれにせよ、重複した値をチェックするには

dct = {'A': [4,3,3,3], 'S': [1]}
if any(len(v) != len(set(v)) for v in dct.values()):
   raise ValueError('Duplicate values in an item list')
于 2012-07-28T14:39:26.287 に答える
0

d がディクショナリの場合 (デフォルトのディクショナリを含む任意のディクショナリにすることができます)。次のコードを使用できます。これにより、辞書内の繰り返しがチェックされます

for i in d.values():
    if len(set(i)) != len(i):
            print str(i) + " error"
于 2012-07-28T14:45:03.950 に答える
0

あなたの例では Python の構文を完全に理解できないので、2 つの異なるアイデアに基づいてお答えします。

何をしたいかは、いつそれをしたいかによって異なります。たとえば、値の重複を防ぎたい場合は、次の方法があります。

x_set = {'A':[4, 3]}
incoming_val = 3
if incoming_val in x_set['A']:
  print("The incoming value already present.")

エラー報告後に重複する値を削除したい場合は、次のようにします。

>>> x_set
{'A': [4, 3, 3]}
>>> list(set(x_set['A']))
[3, 4]
>>> 

リストの追加試行を try .. catch に入れ、例外を通知してキャッチすることもできます。それもPythonicのことです。

于 2012-07-28T14:47:08.340 に答える