Список словарей хотите получить каждое значение и поместить их в отдельный список? - PullRequest
0 голосов
/ 11 декабря 2018

Вывод моего кода дает следующее:

[{'Total Population:': 4585, 'Total Water Ice Cover': 2.848142234497044, 'Total Developed': 17.205368316575324, 'Total Barren Land': 0.22439908514219134, 'Total Forest': 34.40642126612868},

 {'Total Population:': 4751, 'Total Water Ice Cover': 1.047783534830167, 'Total Developed': 37.27115716753022, 'Total Barren Land': 0.11514104778353484, 'Total Forest': 19.11341393206678},

 {'Total Population:': 3214, 'Total Water Ice Cover': 0.09166603009701321, 'Total Developed': 23.50469788404247, 'Total Barren Land': 0.2597204186082041, 'Total Forest': 20.418608204109695},

 {'Total Population:': 5005, 'Total Water Ice Cover': 0.0, 'Total Developed': 66.37545713124746, 'Total Barren Land': 0.0, 'Total Forest': 10.68671271840715},

...
]

Что я хотел бы сделать, это получить все значения для «Всего населения» и сохранить их в одном списке.Затем возьмите все «Total Water Ice Cover» и сохраните это в другом списке, и так далее.С такой структурой данных как извлечь эти значения и сохранить их в отдельных списках?

Спасибо

Ответы [ 5 ]

0 голосов
/ 11 декабря 2018

Если ваша цель - вычислить корреляцию Пирсона , вы должны использовать для этого pandas.

Предположим, что ваш первоначальный список словарей был сохранен в переменной с именем output.Вы можете легко преобразовать его в pandas DataFrame, используя:

import pandas as pd
df = pd.DataFrame(output)
print(df)
#   Total Barren Land  Total Developed  Total Forest  Total Population:  Total Water Ice Cover
#0           0.224399        17.205368     34.406421               4585               2.848142 
#1           0.115141        37.271157     19.113414               4751               1.047784 
#2           0.259720        23.504698     20.418608               3214               0.091666   
#3           0.000000        66.375457     10.686713               5005               1.047784 

Теперь вы можете легко сгенерировать матрицу корреляции:

# this is just to make the output print nicer
pd.set_option("precision",4)  # only show 4 digits

# remove 'Total ' from column names to make printing smaller
df.rename(columns=lambda x: x.replace("Total ", ""), inplace=True)  

corr = df.corr(method="pearson")
print(corr)
#                 Barren Land  Developed  Forest  Population:  Water Ice Cover
#Barren Land           1.0000    -0.9579  0.7361      -0.7772           0.4001
#Developed            -0.9579     1.0000 -0.8693       0.5736          -0.6194
#Forest                0.7361    -0.8693  1.0000      -0.1575           0.9114
#Population:          -0.7772     0.5736 -0.1575       1.0000           0.2612
#Water Ice Cover       0.4001    -0.6194  0.9114       0.2612           1.0000

Теперь вы можете получить доступ к отдельным корреляциям по ключу:

print(corr.loc["Forest", "Water Ice Cover"])
#0.91135717479534217
0 голосов
/ 11 декабря 2018

Если все диктовки имеют одинаковые ключи, то вы можете просто использовать клавиши первого диктанта:

result = {k:[d[k] for d in dictionary_list] for k in dictionary_list[0].keys()} 

Если у диктов может быть разный набор ключей, но вы в порядке со спискамиразной длины, я бы использовал defaultdict для упрощения:

from collections import defaultdict
result = defaultdict(list)
for d in dictionary_list:
    for k, v in d.items():
        result[k].append(v)

Если у dicts могут быть разные наборы ключей, и вы хотите, чтобы все списки были одинаковой длины, тогда вам понадобитсяповторить дважды.Вам также понадобится какое-то значение заполнителя для использования, когда ключ отсутствует.Если мы хотим использовать None для этого, мы можем сделать:

placeholder = None
keys = set()
for d in dictionary_list:
    keys += set(d.keys())
result = {k:[] for k in keys}
for d in dictionary_list:
    for k in keys:
        result[k].append(d.get(k, placeholder))

В каждом случае result является списком списков.Если вам нужен список списков, то на самом деле он еще проще:

result = [[d[k] for d in dictionary_list] for k in dictionary_list[0].keys()]

Если вы хотите, чтобы все списки были одинаковой длины и содержали заполнители, вам все равно придется использовать в качестве промежуточного элемента списки списков.шаг.Но это легко преобразовать из списка списков в список списков значений:

list_of_lists_of_values = list(dict_of_lists_of_values.values())

Тем не менее, до Python 3.7 словари не имели четко определенного порядка итераций, поэтому вы 'Возможно, в любом случае лучше использовать словарь, потому что в противном случае трудно быть уверенным, что вы получаете правильные значения (например, «Общая численность населения» не обязательно будет первой серией значений).

0 голосов
/ 11 декабря 2018

Я думаю, вы можете использовать что-то вроде:

d = [{'Total Population:': 4585, 'Total Water Ice Cover': 2.848142234497044, 'Total Developed': 17.205368316575324, 'Total Barren Land': 0.22439908514219134, 'Total Forest': 34.40642126612868},
 {'Total Population:': 4751, 'Total Water Ice Cover': 1.047783534830167, 'Total Developed': 37.27115716753022, 'Total Barren Land': 0.11514104778353484, 'Total Forest': 19.11341393206678},
 {'Total Population:': 3214, 'Total Water Ice Cover': 0.09166603009701321, 'Total Developed': 23.50469788404247, 'Total Barren Land': 0.2597204186082041, 'Total Forest': 20.418608204109695},
 {'Total Population:': 5005, 'Total Water Ice Cover': 0.0, 'Total Developed': 66.37545713124746, 'Total Barren Land': 0.0, 'Total Forest': 10.68671271840715}]

f = {}
for l in d:
    for k, v in l.items():
        if not k in f:
            f[k] = []
        f[k].append(v)
print(f)

{'Total Population:': [4585, 4751, 3214, 5005], 'Total Water Ice Cover': [2.848142234497044, 1.047783534830167, 0.09166603009701321, 0.0], 'Total Developed': [17.205368316575324, 37.27115716753022, 23.50469788404247, 66.37545713124746], 'Total Barren Land': [0.22439908514219134, 0.11514104778353484, 0.2597204186082041, 0.0], 'Total Forest': [34.40642126612868, 19.11341393206678, 20.418608204109695, 10.68671271840715]}

Python Demo

0 голосов
/ 11 декабря 2018

Вы можете использовать pandas:

pd.DataFrame(my_dict).to_dict(orient='list')

Возвращает:

{'Total Barren Land': [0.22439908514219134, 0.11514104778353484, 0.2597204186082041, 0.0],
'Total Developed': [17.205368316575324, 37.27115716753022, 23.50469788404247, 66.37545713124746],
'Total Forest': [34.40642126612868, 19.11341393206678, 20.418608204109695, 10.68671271840715],
'Total Population:': [4585, 4751, 3214, 5005],
'Total Water Ice Cover': [2.848142234497044, 1.047783534830167, 0.09166603009701321, 0.0]}
0 голосов
/ 11 декабря 2018

Назовите свой список словарей dictionary_list.Затем:

keys = {k  for d in dictionary_list for k in d.keys()}
list_of_values = [[v for d in dictionary_list for k, v in d.items() if k == key] for key in keys]

Используя ваш пример, вы получите:

[[17.205368316575324, 37.27115716753022, 23.50469788404247, 66.37545713124746],
 [0.22439908514219134, 0.11514104778353484, 0.2597204186082041, 0.0],
 [2.848142234497044, 1.047783534830167, 0.09166603009701321, 0.0],
 [4585, 4751, 3214, 5005],
 [34.40642126612868, 19.11341393206678, 20.418608204109695, 10.68671271840715]]

Если вам нужен новый словарь с соответствующими списками значений, то переключите вторую строку с помощью:

new_dict = {key: [v for d in dictionary_list for k, v in d.items() if k == key] for key in keys}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...