Ломтики из ключей многомерного словаря - PullRequest
1 голос
/ 30 января 2020

Мне нужно назначить и извлечь фрагменты данных, используя два ключа, и я не априори знаю значения для одного из ключей.

В частности, я загружаю и обрабатываю файлы текстовых данных, в которых перечислены значения с плавающей точкой по году и продолжительности (например, 1 час). Ключи длительности предопределены, а годы - нет. Данные предоставляются последовательно, по одной строке за раз (другими словами, не в табличной форме).

Поскольку я не знаю все годы в данном файле, пока я пытался использовать defaultdict (dict ). Вот мой пример кода.

from collections import defaultdict
a = defaultdict(dict)

a[2006][2]=0.024
a[2004][2]=0.157
a[2000][1]=0.64
a[2005][2]=0.346
a[2003][2]=0.165
a[2003][6]=0.8
a[2007][12]=0.642
a[2003][1]=0.664
a[2002][6]=0.579
a[2004][1]=0.829
a[2001][6]=0.344
a[2003][3]=0.508
a[2003][12]=0.66
a[2002][1]=0.923

:a

defaultdict(dict,
            {2006: {2: 0.024},
             2004: {2: 0.157, 1: 0.829},
             2000: {1: 0.64},
             2005: {2: 0.346},
             2003: {2: 0.165, 6: 0.8, 1: 0.664, 3: 0.508, 12: 0.66},
             2007: {12: 0.642},
             2002: {6: 0.579, 1: 0.923},
             2001: {6: 0.344}})

Мне нужно сделать три вещи.

  1. Получить все ключи года. Помните, я не знаю их заранее.

  2. Для каждого года извлекайте пары продолжительности: значение. Я понял, что это одно.

    : a[2002]
    
    {6: 0.579, 1: 0.923}
    
  3. Для каждой продолжительности извлекайте пары год: ключ. Я застрял на этом.

Я ценю любую помощь, которую вы можете предложить. Если я буду делать это в numpy, pandas или в другом месте, не стесняйтесь перенаправить меня. Имейте в виду, что я не знаю диапазон года раньше времени, и даже если бы я знал, есть случайные годы разрыва без данных.

Ответы [ 2 ]

0 голосов
/ 31 января 2020
from collections import defaultdict
a = defaultdict(dict)

a[2006][2]=0.024
a[2004][2]=0.157
a[2000][1]=0.64
a[2005][2]=0.346
a[2003][2]=0.165
a[2003][6]=0.8
a[2007][12]=0.642
a[2003][1]=0.664
a[2002][6]=0.579
a[2004][1]=0.829
a[2001][6]=0.344
a[2003][3]=0.508
a[2003][12]=0.66
a[2002][1]=0.923

print(a)

"""

defaultdict(<class 'dict'>, {2006: {2: 0.024}, 2004: {2: 0.157, 1: 0.829}, 2000: {1: 0.64}, 2005: {2: 0.346}, 2003: {2: 0.165, 6:0.8, 1: 0.664, 3: 0.508, 12: 0.66}, 2007: {12: 0.642}, 2002: {6:0.579, 1: 0.923}, 2001: {6: 0.344}})

"""

# Retrieve all the year keys. Remember I don't know them ahead of time.

for item in a:
  print(item)


"""
2006
2004
2000
2005
2003
2007
2002
2001
"""


# For each year, retrieve the duration key:value pairs. I figured that one out.


for year in a:

  dur_key_val = a[year]

  print(year,'=>',dur_key_val)

# For each duration, retrieve the year key: value pairs. I'm stuck on this one.

durationDict  = {}

for year in a:


  dur_key_val = a[year]

  for inner_key in dur_key_val:

    duration = dur_key_val[inner_key]

    durationDict[duration] = { year:inner_key }


print(durationDict)


"""
{0.024: {2006: 2}, 0.157: {2004: 2}, 0.829: {2004: 1}, 0.64: {2000: 1}, 0.346: {2005: 2}, 0.165: {2003: 2}, 0.8: {2003: 6}, 0.664: {2003: 1}, 0.508: {2003: 3}, 0.66: {2003: 12}, 0.642: {2007: 12}, 0.579: {2002: 6}, 0.923: {2002: 1}, 0.344: {2001: 6}}
"""
0 голосов
/ 30 января 2020

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

for i in a:
    print(i, a[i])

Вывод:

2006 {2: 0.024}
2004 {2: 0.157, 1: 0.829}
2000 {1: 0.64}
2005 {2: 0.346}
2003 {2: 0.165, 6: 0.8, 1: 0.664, 3: 0.508, 12: 0.66}
2007 {12: 0.642}
2002 {6: 0.579, 1: 0.923}
2001 {6: 0.344}
...