2016-08-10 72 views
1

我必須有兩個數組(在我的代碼中):「donlist」是隨機捐贈數量在$ 1和$ 100之間的列表,「charlist」是隨機慈善列表數字在1到15之間。我需要使用每個慈善機構的總捐款創建第三個數組。因此,如果慈善#3在「charlist」中出現8次,我必須從「donlist」中獲得相應花車的總和。我完全不知道如何做到這一點,並一直試圖找出過去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

使用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 

注:我刪除了array進口,因爲你只在代碼中使用list秒。

+0

謝謝!你知道我怎麼能得到「總數」給小數點後兩位的結果嗎?或者說,我該如何格式化「d」?我原來格式化爲「donlist」,因爲我無法格式化「d」本身。我只是嘗試將代碼更改爲「d = round(random.uniform(1.00,100.00),2)」,但總計中的某些值仍然有很長的小數。 – user6627144

+0

使用字符串格式。例如,使用類似'「{:.2f}」格式(123.456789)'的格式,最後以'123.46「格式結束。 – Evert

+0

我使用你的defaultdict概念來創建第四個數組「totalnum」,它計算每個慈善機構捐贈的捐贈數量。我現在必須計算每個慈善機構的平均捐贈額,但我不能將這兩個列表分開,因爲它們都有慈善機構的數字。你知道我能做到嗎?非常感謝! – user6627144

1

這似乎是使用zip函數的一個很好的例子。它會得到兩個列表作爲參數(在你的案例中爲donlistcharlist)並創建這些列表的迭代器,所以你可以迭代一次,將donlist中的值添加到正確的慈善位置。 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]捐贈價值。

+0

有人可以解釋爲什麼這被壓低了嗎?謝謝 – Marco

+2

Downvotes隨機發生。但也許有人覺得沒有解釋就有太多的魔力:「拉鍊」本身並不能完成這項工作。 – 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}) 

您現在可以通過慈善號碼索引d並獲得捐贈價值。

相關問題