所以,我有2个列表
veg_type = [Urban,Urban,Forest,OpenForest,Arboretum]
veg_density = [0.5,0.6,0.1,0,0.9]
我想添加与veg_type对应的veg_density。因此,这意味着Urban = 1.1 (This is 0.5+0.6)
Forest = 0.1
OpenForest = 0
Arboretum = 0.9
veg_density和veg_type的索引具有相同的值。这意味着Urban出现在位置0,其相应的veg_density也位于位置0。
另外,我不能假定veg_type中的元素仅限于上述示例。
我该如何解决这个问题?
答案 0 :(得分:3)
使用字典(键到值的映射)将帮助您解决问题:
veg_type = ["Urban", "Urban", "Forest", "OpenForest", "Arboretum"]
veg_density = [0.5, 0.6, 0.1, 0, 0.9]
type_density = {} #Creates a new dictionary
if len(veg_type) == len(veg_density): #pointed out by @lalengua -- veg_type and veg_density need to have the same length
for i in range(len(veg_type)):
if veg_type[i] not in type_density: #If the veg_type isn't in the dictionary, add it
type_density[veg_type[i]] = 0
type_density[veg_type[i]] += veg_density[i]
这将产生:
{'Urban': 1.1, 'Forest': 0.1, 'OpenForest': 0, 'Arboretum': 0.9}
可以像这样访问其值:
type_density['Urban'] = #some value
some_variable = type_density['Forest'] #double quotes can be used as well
关于字典的几件事:
词典具有与特定值对应的键
键在字典中是唯一的-重新定义键将覆盖其值
键可以是字符串,数字或对象-可以哈希的任何内容
键必须在字典中才能对它们应用操作
要预定义字典(而不是将其清空),请使用以下命令:name = {key1 : value1, key2 : value2, key3 : value3, keyN : valueN}
您可以了解有关dict
基本对象at the offical python docs的更多信息。
答案 1 :(得分:2)
单线:
print({k:sum([veg_density[i] for i,val in enumerate(veg_type) if val == k]) for k,v in veg_type})
输出:
{'Urban': 1.1, 'Forest': 0.1, 'OpenForest': 0, 'Arboretum': 0.9}
说明:
使用veg_type
fromkeys
键创建字典
进行字典理解,以使用sum
对值求和,迭代低谷索引和veg_type
的值,并获取作为键k
的值,然后获取索引并获取具有该索引的veg_density
值
或使用pandas
:
df=pd.DataFrame(list(zip(veg_type,veg_density)))
print(df.groupby(0)[1].sum().to_dict())
输出:
{'Arboretum': 0.90000000000000002, 'Forest': 0.10000000000000001, 'OpenForest': 0.0, 'Urban': 1.1000000000000001}
如果关心小数位:
df=pd.DataFrame(list(zip(veg_type,veg_density)))
print({k:float("%.2f"%v) for k,v in df.groupby(0)[1].sum().to_dict().items()})
输出:
{'Arboretum': 0.9, 'Forest': 0.1, 'OpenForest': 0.0, 'Urban': 1.1}
说明:
使用pandas
创建一个数据帧,其中list(zip(..))
和veg_type
的列表值为veg_density
然后做熊猫groupby
,以删除列0
中的重复项,然后向下推,以得到列1
的总和,其中列0的值相同行
相关:
注意:
Pandas是必须安装的库,而不是默认软件包
答案 2 :(得分:1)
>>> from collections import defaultdict
>>> veg_type = ['Urban','Urban','Forest','OpenForest','Arboretum']
>>> veg_density = [0.5,0.6,0.1,0,0.9]
>>> sums = defaultdict(int)
>>> for name,value in zip(veg_type,veg_density):
... sums[name] += value
...
>>> sums
defaultdict(<class 'int'>, {'Urban': 1.1, 'Forest': 0.1, 'OpenForest': 0, 'Arboretum': 0.9})
答案 3 :(得分:1)
veg_type = ["Urban", "Urban", "Forest", "OpenForest", "Arboretum"]
veg_density = [0.5, 0.6, 0.1, 0, 0.9]
duos = zip(veg_type, veg_density)
result = {} #or dict.fromkeys(set(veg_type), 0)
for i in set(veg_type):
result[i] = sum([d for t, d in duos if t==i])
输出:
{'树木园':0.9,'森林':0.1,'OpenForest':0,'城市':1.1}
一行中的版本:
veg_type = ["Urban", "Urban", "Forest", "OpenForest", "Arboretum"]
veg_density = [0.5, 0.6, 0.1, 0, 0.9]
{ e:sum([d for t, d in zip(veg_type, veg_density) if t==e]) for e in set(veg_type)}
输出:
{'树木园':0.9,'森林':0.1,'OpenForest':0,'城市':1.1}
答案 4 :(得分:0)
您可以将两个列表一起zip
,然后使用groupby
来填充dictionary
。 itemgetter
可以替换为lambda x: x[0]
from itertools import groupby
from operator import itemgetter
z = zip(veg_type, veg_density)
d = {}
for k, g in groupby(z, key=itemgetter(0)):
d[k] = sum([i[1] for i in g])
# {'Urban': 1.1, 'Forest': 0.1, 'OpenForest': 0, 'Arboretuem': 0.9}