2017-12-22 10 views
0

私はhtmlのソースを抽出し、すべてを大きな辞書に変換しました。辞書:キーと値の各要素が等しいかどうかを確認してください

これが唯一の例である:

d = {fist:mist} 

私の目標は、そのインデックスで文字を比較することです:

(key[0] & value[0], key[1] & value[1], etc.) 

と文字が等しいかどうかを確認:

f != m, i == i, s==s, t==t 

私ができるベスト:

d = {fist:mist} 

difference = 0 
no_difference = 0 

for key, value in d.items(): 
     for char1 in key: 
      pass 
     for char2 in value: 
      pass 
     if char1 != char2: 
     difference += 1 
     if char1 == char2: 
     no_difference +=1 

print(difference) 
print(no_difference) 

私は助けていただきありがとうございます。

編集:Glenn Codes、Joe Iddon、MikeMüllerに大きな感謝!キーと値を仮定し

+0

は、あなたの出力がために何をしたいですか?合計差の数? *すべて*が同じであればTrue/False?他に何か... –

+0

この例では、dict:{fist ':' mist '、' fist1 ':' mist22 '、' x ':'ここに多くの相違点 '} 'の出力がありますか? –

+0

@MikeMüllerいいえ、目標は各キー:値のペアの違いを評価することです。私は各キーを抽出します:新しい辞書への値と別々の違いを確認してください(少し複雑すぎるようですが) – Miggl

答えて

3

あなたは辞書でkey : valueペアをループする必要があります。各ペアについて、keyvalueの間にいくつの相違があるか調べる必要があります。これは、異なる文字のみを含むlistの長さを計算することによって行うことができます。

この長さをループ外の変数に追加するだけで、合計を記録できます。ここで小例えば、'f''m'として1与え、

d = {"fist":"mist"} 
differences = 0 
for k, v in d.items(): 
    differences += len([i for i,c in enumerate(k) if c != v[i]]) 

print(differences) 

が異なっています。


あなたも(すなわち、異なるない)と一致する文字の数をカウントしたい場合は、あなただけの文字の数を取得するには、同じプロセスを行うが、keyの長さマイナス違いを追加することができますこれは同じであった:再び1としてdifferencesを与えるだけでなく、('i''s'及び't'ため)3としてsame与える

d = {"fist":"mist"} 
differences = 0 
same = 0 
for k, v in d.items(): 
    differences += len([i for i,c in enumerate(k) if c != v[i]]) 
    same += len(k) - differences 

print(differences) 
print(same) 

。与え

all(k == v for k,v in d.items()) 


あなただけのブールを望んでいた場合(True/Falseいかなるペアの間のいずれかの違いがあるかどうか、あなたは1行で全体の動作を行うことができます値この場合はFalseです。

+0

ありがとうあなたの時間! – Miggl

+0

@Migglあなたの感謝の気持ちを示すために答えを受け入れてください。 –

+0

'd = {" fist27 ":" mist "}'私に 'IndexError'を与えます。 –

1

はあなたが行うことができ、同じ長さになります。

for key, value in d.items(): 
    for i in range(len(key)): 
     if key[i] == value[i]: 
      no_difference +=1 
     else: 
      difference += 1 
+0

キー/値の長さを使ってもう一方から計算できるので、実際には 'no_difference'と' difference'の両方を追跡する必要はありませんが、この解決策はあなたがすでに持っているものに最も近くなります。 –

+0

キーと値は必ずしも同じ長さではありませんが、助けてくれました、ありがとうございます! – Miggl

+0

ああ、最短、キー、または値のいずれかの長さを範囲として使うことができます。次に良い方法は、マッチするオカレンスを単純に追跡することです。 (この場合、 'no_difference')' difference'は自動的に 'no_difference'の値を差し引いたもので、最も長いものの長さになります。 'fist'と' misty'の場合、5_3 = 2の 'misty'の長さから' no_difference'を引くと、 'no_difference'は3になり、' difference'は2になります。 –

1

複数の項目とキーと値の可能な長さの異なる辞書を仮定すると、これは動作するはずです:

from itertools import zip_longest 

d = {'fist': 'mist', 'fist1': 'mist22', 'x': 'many differences here'} 

difference = 0 
no_difference = 0 

for k, v in d.items(): 
    for item1, item2 in zip_longest(k, v, fillvalue=''): 
     if item1 == item2: 
      no_difference += 1 
     else: 
      difference += 1 

print('difference:', difference) 
print('no_difference:', no_difference) 

出力:

difference: 25 
no_difference: 6 
+0

コメントありがとう!私はあなたのソリューションを関数と外部の両方に実装しようとしました。外部的にはうまくいくようですが、あまりにも多くの違いを表示します。この関数では、Noneを返します。私はそれのために大きな頭痛を覚えている、休憩を取ると明日再び試してみる。御時間ありがとうございます! – Miggl

関連する問題