我必须有两个数组(在我下面的代码中):“捐助列表”是1到100美元之间的随机捐赠金额列表,而"charlist“是1到15之间的随机慈善数字列表。我需要创建第三个数组,使用每个慈善机构的捐款总额。所以,如果3号慈善在“慈善名单”中出现了8次,我必须从“捐献者名单”中得到相应浮动的总和。我完全不知道该怎么做,在过去的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发布于 2016-08-10 04:24:02
使用一个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导入,因为您只在代码中使用lists。
发布于 2016-08-10 04:26:09
这似乎是一个使用zip函数的好例子。它获得两个作为参数的列表(在您的例子中是donlist和charlist),并创建其中的迭代器,因此您可以在正确的慈善位置上迭代一次从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) ]这是一个从迭代器创建列表的简单语法。您可以阅读更多关于它的这里。
通过这种方式,您可以保证它适用于在计算过程中不生成这些列表的情况,例如用户输入这些值的情况。
在列表生成/输入之后,只需:
# 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]中的捐赠价值。
发布于 2016-08-10 05:09:57
>>> 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并获得捐赠的价值。
https://stackoverflow.com/questions/38864103
复制相似问题