2017-09-01 18 views
0

辞書のキーをPython3で作成する必要があります。 end = ''関数で1行に出力できますが、そのように更新することはできません。Python3で辞書キーを使って1行の文字列を作成する

私は以下のような辞書を持っています。

array = { 
'MERCHANT': "TEST", 
'ORDER_REF': "Test123", 
'BACK_REF': "http://2ac99X37.ngrok.io/", 
'ORDER_PNAME[0]': "BLA", 
'ORDER_PCODE[0]': "BLA", 
'ORDER_PINFO[0]': "BLA", 
'ORDER_PRICE[0]': "1", 
'ORDER_VAT[0]': "18", 

}

、私は自分のキーにそれらをソートし、長さ

for k, v in sorted(array.items()): 
hashstring =str(len(v)) + str(v) 

を得るが、私はこの段階でhashstringを印刷するとき、彼らは以下のように印刷しています

25http://2ac99X37.ngrok.io/ 
4TEST 
3BLA 
3BLA 
3BLA 
11 
7Test123 
218 
私は本当のハッシュ計算するので、以下のようにそれらを更新する必要が

25http://2ac99X37.ngrok.io/ 4TEST 3BLA 3BLA 3BLA 11 7Test123 218 

iは前述したと同様

。私はend = '' 関数で1行に出力できますが、これは "hashstring"パラメータの値に影響しません。

私のハッシュ計算コードは以下の通りです。

signature = hmac.new(secret.encode('utf-8'), hashstring.encode('utf-8'), hashlib.md5).hexdigest() 

あなたは私を支援していただけますか?

ベスト、

+0

は、ループの前に 'hashstring'を初期化して、+ = 'の代わりに' 'hashstring = –

答えて

0

あなたのコードが正しくフォーマットされていません。

あなたのforループに問題があると思います。

hashstring =str(len(v)) + str(v)と記述すると、印刷するたびに異なる値が表示されます。

次のように、あなたのループ内でそれに連結し続ける、あなたはあなたのループの前にhashstringを初期化する必要があり

hashstring='' 
for k, v in sorted(array.items()): 
    hashstring += str(len(v)) + str(v) 
print(hashstring) 
+0

OMG!私は今泣くことができます、私はそれがインデントのためだと信じることはできません。 ありがとうございました!、その仕事@bphi – Gokturk

0

あなたが区切りと1つの文字列に多くの個々の文字列を結合したいしたいときはいつでも、あなたは.joinを使用したいです。だから、彼らは.joinそして、リストにあなたの部品を蓄積:

In [6]: hashparts = [] 

In [7]: for k, v in sorted(array.items()): 
    ...:  hashparts.append(str(len(v)) + str(v)) 
    ...: 

In [8]: hashstring = ' '.join(hashparts) 

In [9]: print(hashstring) 
25http://2ac99X37.ngrok.io/ 4TEST 3BLA 3BLA 3BLA 11 7Test123 218 
+0

こんにちは@juanpaの' hashstringを使用しています。arrivillaga、 あまりにも作品です!どうもありがとうございますが、私はbphiの方法を使って1行で更新したいと考えています。 – Gokturk

+0

@ Gokturkあなたが知っている通り、上記のO(n)の代わりにそのメソッドをO(n^2)にすることはできますが、文字列が小さければ大したことではありません。 –

+0

こんにちは@MosesKoledoye サンプルコードを準備していますが、ロジックを明示的にするために、最も簡単な方法で – Gokturk

1

をお試しください:

hashstring = '' 
for k, v in sorted(array.items()): 
    hashstring += '{}{} '.format(len(v), v) 
hashstring = hashstring[:-1] # to remove the trailing space 

出力:

25http://2ac99X37.ngrok.io/ 4TEST 3BLA 3BLA 3BLA 11 7Test123 218 

または、ループの代わりにリストの補完を使用して、次のように1行で行うことができます。

hashstring = ' '.join(['{}{}'.format(len(v), v) for k, v in sorted(array.items())]) 
関連する問題