2016-04-12 11 views
1

私は書籍の名前とその確率を出力しようとしています。私が達成しようとしています何カスタマイズされた方法でデータを出力するにはどうすればよいですか?

Happy Journey, What a Good Life!, Far Far Away, Slow and Steady, The Meeting 
(0.94, 0.56, 0.43, 0.24, 0.10) 

名とペア確率を持つようにされています:これは、現在の出力は次のようになります

Happy Journey(0.94), What a Good Life!(0.56), Far Far Away(0.43), Slow and Steady(0.24), The Meeting(0.10) 

は、これは私が今までやっていることです。

f.write("Top 5 Probable Books:")  

for item in w: 
    f.write(d.get(int(item))) #gets the names of the book from a dictionary 
    f.write(", ")    # w is a label in the dictionary 
f.write("\n") 

これは私のprob5のようなものです:[[0.940021 0.561000 0.430012 0.241982 0.100134]]これは私が4桁の小数点以下を四捨五入しているため、このnumpyの配列から確からしさを抽出する必要があります。

for pk in prob5: 
    jk=', '.join("%.4f" %b for b in pk) #picking out probabilities from a numpy array 
    jk="("+jk+ ")" + "\t" 
    f.write(jk) 

2つのループを同時に実行して、目的の出力フォーマットを実現する方法が少し混乱しています。

答えて

2

私はnumpyの配列を操作する時に発生する問題の種類を知っているが、あなたが直接prob5[0]としての0番目の要素にアクセスすることができ述べたようprob5場合ではありません。 4小数点以下を印刷する場合は、.format()の構文を見てください。

あなたは、Python 3を使用していると仮定すると:あなたは、Python 2.xのを使用している場合

>>> f.write(', '.join('{}({:.4f})'.format(string, number) for string, number in zip(w, prob5[0]))) 
Happy Journey(0.9400), What a Good Life!(0.5610), Far Far Away(0.4300), Slow and Steady(0.2420), The Meeting(0.1001) 

は、ネイティブzipよりもパフォーマンスが向上したitertoolsモジュールとそのizip関数を使用します。オブジェクトの要素数が異なる場合は、代わりにizip_longestを使用してください。

# example 
import itertools 
... 
f.write(', '.join('{}({})'.format(string, number) for string, number in itertools.izip(w, prob5))) 
#f.write(', '.join('{}({})'.format(string, number) for string, number in itertools.izip_longest(w, prob5))) # if w and prob5 have a different number of elements 
+0

こんにちは、** prob5 **を使用することはできません。それに関するいくつかの詳細を含むように質問を更新しました。私はprob5で内部ループを実行していたので、まずそれから確率を抽出する必要があります。 – minks

+0

@minks:答えを編集しました。それでも問題が解決しない場合は、numpyの問題についてより詳しく説明してください。 –

+0

こんにちは、これは今動作します。私はなぜ最初のprob5要素にフォーマットが適用されないのか不思議に思っていました。次の4文字だけが小数点以下4桁に縮小されます。 – minks

1

zipを使用して2つのリストを結合し、次にitertools grouperを2つのグループに分割することができます。

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return zip_longest(*args, fillvalue=fillvalue) 

for group in grouper(zip(w, prob5), 2): 
    print(group) 
+0

こんにちは、私は...理由はprob5がnumpyの配列であるということで、** prob5の詳細を含めるために、質問を更新しましたので、私はそれが値を抽出するための内部ループを実行する必要があります。.. – minks

1

このような意味ですか?

names = ['Happy Journey', 'What a Good Life!', 'Far Far Away', 'Slow and Steady', 'The Meeting'] 
probabilities = (0.94, 0.56, 0.43, 0.24, 0.10) 
myDesiredOutput = ['{}({})'.format(names[n],probabilities[n]) for n,v in enumerate(names)] 

>>>myDesiredOutput 
['Happy Journey(0.94)', 
'What a Good Life!(0.56)', 
'Far Far Away(0.43)', 
'Slow and Steady(0.24)', 
'The Meeting(0.1)'] 

し、ファイルへの出力を直接書き込むように:

with open('out.txt', 'w') as f: 
    for item in ['{}({})\n'.format(names[n],probabilities[n]) for n,v in enumerate(names)]: 
     f.write(item) 

あなたが1つの行に出力を書きたい場合は、',''\n'を変更することができます。

関連する問題