首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过在两个列表中组合值来创建第三个列表

通过在两个列表中组合值来创建第三个列表
EN

Stack Overflow用户
提问于 2016-08-10 04:13:54
回答 3查看 187关注 0票数 1

我必须有两个数组(在我下面的代码中):“捐助列表”是1到100美元之间的随机捐赠金额列表,而"charlist“是1到15之间的随机慈善数字列表。我需要创建第三个数组,使用每个慈善机构的捐款总额。所以,如果3号慈善在“慈善名单”中出现了8次,我必须从“捐献者名单”中得到相应浮动的总和。我完全不知道该怎么做,在过去的2-3个小时里,我一直在想办法。有人知道怎么做吗?谢谢。

代码语言:javascript
复制
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

样本输出:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-10 04:24:02

使用一个dict,以慈善号码为关键。您只需将捐赠添加到相应的dict值。如果dict元素还不存在,将其设置为零作为其初始值。我使用的是defaultdict:如果键还不存在,lambda: 0参数将保证值为零,否则只需添加到其中。

更新您的脚本(稍加一些其他修改):

代码语言:javascript
复制
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。

票数 2
EN

Stack Overflow用户

发布于 2016-08-10 04:26:09

这似乎是一个使用zip函数的好例子。它获得两个作为参数的列表(在您的例子中是donlistcharlist),并创建其中的迭代器,因此您可以在正确的慈善位置上迭代一次从donlist中添加值。zip示例:

代码语言:javascript
复制
for a, b in zip(range(1, 5), range(5, 10)):
    print(a, b)

威尔输出

代码语言:javascript
复制
1 5
2 6
3 7
4 8

我强烈建议在创建第三个数据列表之前生成数据列表,因此可以这样做。

代码语言:javascript
复制
donlist = [ random.uniform(1.0, 100.0) for _ in range(0, 100) ]
charlist = [ random.randint(1, 15) for _ in range(0, 100) ]

这是一个从迭代器创建列表的简单语法。您可以阅读更多关于它的这里

通过这种方式,您可以保证它适用于在计算过程中不生成这些列表的情况,例如用户输入这些值的情况。

在列表生成/输入之后,只需:

代码语言:javascript
复制
# 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]中的捐赠价值。

票数 1
EN

Stack Overflow用户

发布于 2016-08-10 05:09:57

代码语言:javascript
复制
>>> 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并获得捐赠的价值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38864103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档