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

时间:2016-08-10 04:13:54

标签: python list

我必须有两个数组(在我的代码中):" 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

3 个答案:

答案 0 :(得分: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:我删除了array导入,因为您只在代码中使用了list

答案 1 :(得分: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]的捐赠价值。

答案 2 :(得分: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并获取捐赠的价值。

相关问题