Как разбить массив словарей в Python? - PullRequest
0 голосов
/ 03 октября 2018
[{50: 2, 75: 3, 99: 4}, {50: 5, 75: 6, 99: 7}, {50: 8, 75: 9, 99:10}] 

Ниже приведен массив словарей в Python.Я хочу преобразовать массив в следующие три массива в Python:

[2, 5, 8] # corresponding to 50.
[3, 6, 9] # corresponding to 75.
[4, 7, 9] # corresponding to 99. 

Ответы [ 5 ]

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

Если ваша цель - 3 отдельных списка , вы можете создать каждый список с списком

l = [{50: 2, 75: 3, 99: 4}, {50: 5, 75: 6, 99: 7}, {50: 8, 75: 9, 99:10}]

l_50 = [v for i in l for k, v in i.items() if k == 50] # => [2, 5, 8]
l_75 = [v for i in l for k, v in i.items() if k == 75] # => [3, 6, 9]
l_99 = [v for i in l for k, v in i.items() if k == 99] # => [4, 7, 10]

Или вы можете создать словарь и поиск по каждому списку по key

d = {k: [j[x] for j in l for x in j if x == k] for i in l for k in i}
{50: [2, 5, 8], 75: [3, 6, 9], 99: [4, 7, 10]}
0 голосов
/ 03 октября 2018

Диктофон Python - это несортированная коллекция, по крайней мере, до Python 3.6, поэтому вы не можете гарантировать, что ключи сохраняют порядок вставки.И так как вы хотите, чтобы ключи были в числовом порядке, нам нужно отсортировать их.

Затем мы можем использовать понимание списка, чтобы извлечь соответствующие значения из каждого dict в списке, и использовать присвоение кортежей для назначения каждого изсписок под отдельным именем.

data = [{50: 2, 75: 3, 99: 4}, {50: 5, 75: 6, 99: 7}, {50: 8, 75: 9, 99:10}]
a, b, c = [[d[k] for d in data] for k in sorted(data[0].keys())]

FWIW, может быть удобнее сохранить выходные данные как один список списков, а не как 3 отдельных списка.

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

Предполагая, что ваш список хранится как l, вы можете использовать zip для транспонирования значений dict в:

list(zip(*(d.values() for d in l)))

Это возвращает:

[(2, 5, 8), (3, 6, 9), (4, 7, 10)]
0 голосов
/ 03 октября 2018

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

>>> {k: [d.get(k) for d in my_list_of_dicts] for k in my_list_of_dicts[0]}
{50: [2, 5, 8], 75: [3, 6, 9], 99: [4, 7, 10]}
0 голосов
/ 03 октября 2018

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

from collections import defaultdict

my_list = [{50: 2, 75: 3, 99: 4}, {50: 5, 75: 6, 99: 7}, {50: 8, 75: 9, 99:10}] 
my_dict_list = defaultdict(list)

for value in my_list:
    for k,v in value.items():
        my_dict_list[k].append(v)

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

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