Python根据另一个列表中的名称将值添加到一个列表中。

3
所以,我有两个列表 veg_type = [城市,城市,森林,开放森林,植物园] veg_density = [0.5,0.6,0.1,0,0.9] 我想要将与veg_type相对应的veg_density相加。这意味着城市= 1.1(即0.5 + 0.6) 森林= 0.1 开放森林= 0 植物园= 0.9 veg_density和veg_type的索引具有相同的值。这意味着如果Urban出现在位置0,则其对应的veg_density也在位置0。 此外,我不能假设veg_type中的元素仅限于上述示例。 我该如何解决这个问题?

2
想象一下“字典”。 - molbdnilo
1
为什么不考虑使用Pandas? - BENY
5个回答

4
使用字典(键值对映射)将帮助您解决问题:
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}

你可以在Python官方文档中了解更多关于字典的内容。

这是最清晰的答案和代码,无需导入,比那些“一行代码”狂热者更简单。只要确保veg_typeveg_density具有相同的大小,否则它将会出错。 - lalengua
你可以使用dict.get而不是if veg_type[i] not in type_density - mikeLundquist

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}

解释一下:

  • 使用fromkeysveg_type作为键创建一个字典

  • 使用字典推导式对值进行求和,使用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_typeveg_density列中; 然后进行groupby操作以移除列0中的重复项,将列1的总和下推,使得列0在同一行中具有相同的值。
相关链接:pandas文档 注意:Pandas是需要安装的库,不是默认包。

1
你可以使用以下两行代码 {vt: sum([veg_density[i] for i, tvt in enumerate(veg_type) if tvt == vt]) for vt in veg_type} ,无需创建 d - slider
@slider 没错,忘记了,对字典上瘾了 :-) - U13-Forward
@slider 完成了 - U13-Forward

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})

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])

输出:

{'Arboretum': 0.9, 'Forest': 0.1, 'OpenForest': 0, 'Urban': 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,'开放森林': 0,'城市': 1.1}


0
你可以将这两个列表 zip 在一起,然后使用 groupby 填充字典。可以用 lambda x: x[0] 替换 itemgetter
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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接