Python根据另一个列表中的名称在一个列表中添加值

时间:2018-10-09 01:19:27

标签: python list

所以,我有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中的元素仅限于上述示例。 我该如何解决这个问题?

5 个答案:

答案 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 docs

注意:

  

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来填充dictionaryitemgetter可以替换为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}