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

myArray = {0: {
    'valueset1' : {
        'val1' : 345,
        'val2' : 56,
    },
    'success' : True},
},
{1: {
    'valueset1' : {
        'val1' : 145,
        'val2' : 156,
    },
    'success' : True},
},
{2: {
    'valueset1' : {
        'val1' : 35,
        'val2' : 6,
    },
    'success' : True},
}

Я пытаюсь вернуть индекс записи с наименьшим значением value1.val1 - поэтому в приведенном выше примере она вернет 2

У меня есть это до сих пор ...

x = min(myArray['valueset1']['val1'])

Я думаю, что это не работает, потому что я не перебираю словарь, где я ошибаюсь?

0
fightstarr20 7 Июл 2019 в 13:56

4 ответа

Лучший ответ

Ваш вложенный словарь неправильный, я изменил его И код для получения минимального значения написан ниже: -

myArray = { 0: {
          'valueset1' : {
          'val1' : 345,
           'val2' : 56,},
           'success' : True},
          1: {
          'valueset1' : {
          'val1' : 145,
             'val2' : 156,},
            'success' : True},

           2: {
               'valueset1' : {
               'val1' : 35,
              'val2' : 6,},
              'success' : True},
           }

import numpy as np
new_list = np.array([])
new_key = np.array([])
for var in myArray:
    new_list = np.append( new_list ,myArray[var]['valueset1']['val1'] )
    new_key = np.append(new_key, var)
index = new_list.argmin()  # It will give indexing value of a minimum value.
new_key[index]

< Сильный > аудиовыхода

2

Я надеюсь, что это может помочь вам

1
Rahul charan 7 Июл 2019 в 11:41

Это должно сделать хитрость:

array_val1 = [x[i]['valueset1']['val1'] for i,x in enumerate(myArray)]
array_val1.index(min(array_val1))

Вы забыли скобки [] в определении массива :)

2
Theo 7 Июл 2019 в 11:06

Здесь myArray - это не dict, а tuple элементов типа dict.

Вы можете попробовать это:

myArray = {0: {
    'valueset1' : {
        'val1' : 345,
        'val2' : 56,
    },
    'success' : True},
},{1: {
    'valueset1' : {
        'val1' : 145,
        'val2' : 156,
    },
    'success' : True},
 },{2: {
    'valueset1' : {
        'val1' : 35,
        'val2' : 6,
    },
    'success' : True},
}

val = []                     # Here, val is a list of tuples (index, value)
for i in range(len(myArray)):
    val.append((i, myArray[i][i]['valueset1']['val1']))

val.sort(key=lambda x: x[1]) # sort the list "val" in ascending order based on value
print('Index of minimum value in dictionary is {}'.format(val[0][0]))

Выход:

Index of minimum value in dictionary is 2
0
Anubhav Singh 7 Июл 2019 в 11:30

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

myArray = {0: {'success': True, 'valueset1': {'val2': 56, 'val1': 345}}, 1: {'success': True, 'valueset1': {'val2': 156, 'val1': 145}}, 2: {'success': True, 'valueset1': {'val2': 6, 'val1': 35}}}
def get_l(d):
   return [c for b in d.values() for c in ([b] if isinstance(b, int) else get_l(b))]

d = {a:list(filter(lambda x:not isinstance(x, bool), get_l(b))) for a, b in myArray.items()}
final_result = min(d, key=lambda x:min(d[x]))

Выход:

2
0
Ajax1234 7 Июл 2019 в 16:23