2016-08-10 8 views
1

2つの配列(以下のコード内にあります): "donlist"は$ 1〜$ 100の間のランダムな寄付金のリスト、 "charlist"はランダムな寄付のリストです1から15までの数字です。各寄付金の寄付総額を使って3番目の配列を作成する必要があります。だからcharity#3が "charlist"に8回現れたら、 "donlist"から対応する浮動小数点の合計を得なければなりません。私はこれをどうやって行うのか全く分かりませんでしたが、今のところ2〜3時間はそれを理解しようとしています。誰もそれを行う方法を知っていますか?ありがとうございました。2つのリストの値を組み合わせて3番目のリストを作成します

import random 
from array import * 

counter = 0 
donlist = [] 
charlist = [] 

while counter != 100: 
    d = random.uniform(1.00,100.00) 
    c = random.randint(1,15) 
    counter +=1 
    donlist.append(d) 
    donlist = [round(elem,2) for elem in donlist] 
    charlist.append(c) 
    if counter == 100: 
     break 

出力例:

Charity Total Donations 
1   802.65 
2   1212.25 
3   108.25 
4   9324.12 
5   534.98 
6   6235.12 
7   223.18 
8   11.12 
9   3345.68 
10   856.68 
11   7123.05 
12   6125.86 
13   1200.25 
14   468.32 
15   685.26 
+0

物事を鮮明にするために、入力と予想される出力の簡単な例を挙げることができますか? – Julien

+0

ああ、私は今それを追加します。 – user6627144

+0

Pythonでは、配列とリストは2つの異なるものです。あなたの例では –

答えて

2

キーとしてチャリティー番号で、dictを使用してください。寄付を対応するdict値に単に追加するだけです。 dict要素がまだ存在しない場合は、その初期値としてゼロに設定します。 私はdefaultdictを使用しています:lambda: 0引数は、キーがまだ存在しない場合はゼロの値を保証します。そうでなければ、それを追加するだけです。

(いくつかのマイナーな他の変更で)スクリプトの更新:

import random 
from collections import defaultdict 

donlist = [] 
charlist = [] 
totals = defaultdict(float) 

counter = 0 
while counter != 100: 
    counter += 1 
    d = random.uniform(1.00,100.00) 
    c = random.randint(1,15) 
    donlist.append(d)  
    donlist = [round(elem,2) for elem in donlist] 
    charlist.append(c)  
    totals[c] += d 

NBを:あなたはコードだけでlist Sを使用しているので、私は、arrayインポートを削除しました。

+0

ありがとう!小数点以下第2位の結果を得るために「合計」を得る方法を知っていますか?あるいは、「d」をどのようにフォーマットできますか?もともと私は "d"をフォーマットすることができなかったので、代わりに "ドンリスト"をフォーマットしました。私はちょうど "d = round(random.uniform(1.00,100.00)、2)"にコードを変更しようとしましたが、合計のいくつかの値はまだ非常に長い小数を持っています。 – user6627144

+0

文字列の書式設定を使用します。例: '' {:.2f}」形式(123.456789) 'を使用すると、文字列「123.46」になります。 – Evert

+0

私はあなたのdefaultdictコンセプトを使って4番目の配列 "totalnum"を作成しました。これはチャリティごとに寄付された寄付の数を計算します。私は今、慈善団体ごとの平均寄付額を計算しなければなりませんが、2つのリストには両方ともチャリティ番号があるので、2つのリストを分けることはできません。私はこれをどのようにすることができるか知っていますか?どうもありがとうございます! – user6627144

1

これは、zip機能を使用する良い例のようです。引数として2つのリスト(場合によってはdonlistcharlist)を取得し、これらのイテレータを作成するので、donlistの値を右のチャリティの位置に追加して1回反復することができます。 zip例:

for a, b in zip(range(1, 5), range(5, 10)): 
    print(a, b) 

意志出力

1 5 
2 6 
3 7 
4 8 

私は強くあなたが

donlist = [ random.uniform(1.0, 100.0) for _ in range(0, 100) ] 
charlist = [ random.randint(1, 15) for _ in range(0, 100) ] 

を行うことができますので、これは、作成するための単純な構文で、第三を作成する前に、データリストを生成するお勧めしますイテレータからのリストあなたはそれについてもっと読むことができますhere

このようにして、計算中にこれらのリストが生成されない場合(例:ユーザーが値を入力した場合)に、このように動作することが保証されます。

リスト生成/入力することができますだけで後:最後に

# this is the same as a list comprehension but for a dict 
# https://docs.python.org/3/tutorial/datastructures.html#dictionaries 
result = { char : 0 for char in range(1, 16) } 
for don, char in zip(donlist, charlist): 
    result[char] += don 

各慈善Nは、それがresult[N]に寄付値のしています。あなたは今、寄付の価値をチャリティー数によってインデックスdと取得することができます

+0

誰かがなぜこれがdownvotedになったか教えていただけますか?ありがとう – Marco

+2

ダウンボントはランダムに発生します。しかし、おそらく誰かが説明なしにあまりにも多くの魔法があると感じました。「ジップ」それ自体は仕事をしません。 – Evert

+0

私は理解します、私はこの情報を追加するためにこの返信を変更しています。ありがとう! – Marco

0
>>> l1 = [1,1,3,4] # charity list 
>>> l2 = [5,6,7,8] # donation list 
>>> zip(l1,l2) 
[(1, 5), (1, 6), (3, 7), (4, 8)] 

>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> for k,v in zip(l1,l2): 
... d[k] += v 
... 
>>> d 
defaultdict(<type 'int'>, {1: 11, 3: 7, 4: 8}) 

関連する問題