Python добавляет значения в один список в соответствии с именами в другом списке - PullRequest
0 голосов
/ 09 октября 2018

Итак, у меня есть 2 списка veg_type = [Urban,Urban,Forest,OpenForest,Arboretum] veg_density = [0.5,0.6,0.1,0,0.9] Я хочу добавить veg_density, соответствующий veg_type.Это означает, что 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 голосов
/ 09 октября 2018

Вы можете 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}
0 голосов
/ 09 октября 2018
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}

0 голосов
/ 09 октября 2018
>>> 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})
0 голосов
/ 09 октября 2018

Однострочный:

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

  • , затем выполните pandas groupby для удаления дубликатов в столбцах 0, затем нажмите вниз, чтобы получитьсумма столбцов 1 со столбцом 0, имеющим значение в той же строке

Связанные:

pandas docs

Примечание:

Pandas - это библиотека, котораядолжен быть установлен, а не пакет по умолчанию

0 голосов
/ 09 октября 2018

Использование словарей (карт ключ-значение) позволит вам решить вашу проблему:

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 ионных объектах в официальных документах Python .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...