Как заменить вложенное значение словаря Python из ключа в виде строкового формата с разделенными точками?

В bash вы можете построить командную строку следующим образом:

$ z=10
$ echo $z
10
$ Rscript -e "args<-commandArgs(TRUE);x=args[1]:args[2];x;mean(x);sd(x)" 1 $z
 [1]  1  2  3  4  5  6  7  8  9 10
[1] 5.5
[1] 3.027650
$

Вы можете видеть, что переменная $z заменена оболочкой bash с «10», и это значение подбирается по commandArgs и подается в args[2], а команда диапазона x=1:10, выполненная R успешно, и т. д. и т. д.

0
задан Jai K 18 January 2019 в 13:35
поделиться

3 ответа

Если вы в порядке с использованием exec () и изменили ваши str_key (s), вы можете сделать что-то вроде:

def get_keys_value(string):
    keys, value = string.split("=")
    return keys, value

def get_exec_string(dict_name, keys):
    exec_string = dict_name
    for key in keys.split("."):
        exec_string = exec_string + "[" + key + "]"
    exec_string = exec_string + "=" + "value"
    return exec_string

str_key_1 = "'user'.'username'=john"
str_key_2 = "'user'.'name'.'last'=henry"
str_key_list = [str_key_1, str_key_2]

for str_key in str_key_list:
    keys, value = get_keys_value(str_key) # split into key-string and value
    exec_string = get_exec_string("a", keys) # extract keys from key-string 
    exec(exec_string)

print(a)
# prints {'user': {'email': 'micheal@domain.com', 'name': {'last': 'henry', 'first': 'Micheal'}, 'username': 'john'}}
0
ответ дан Sanchit Mathew 18 January 2019 в 13:35
поделиться

Я бы пошел с рекурсивной функцией, чтобы выполнить это, предполагая, что все строки значений ваших ключей верны:

def assign_value(sample_dict, str_keys, value):
  access_key = str_keys[0]

  if len(str_keys) == 1:
    sample_dict[access_key] = value
  else:
    sample_dict[access_key] = assign_value(sample_dict[access_key], str_keys[1:], value)

  return sample_dict

Идея состоит в том, чтобы проходить через dict, пока вы не достигнете самого низкого key и затем мы присваиваем наше новое значение этому последнему ключу;

if __name__ == "__main__":
  sample_dict = {
      'user': {
          'username': 'mic_jack',    
          'name': {
              'first': 'Micheal',
              'last': 'Jackson'
          },
          'email': 'micheal@domain.com'
      }     
  }

  str_key_1 = 'user.username=john'
  str_keys_1, value_1 = str_key_1.split('=')
  sample_dict = assign_value(sample_dict, str_keys_1.split('.'), value_1)

  print("result: {} ".format(sample_dict))


  str_key_2 = 'user.name.last=henry'
  str_keys_2, value_2 = str_key_2.split('=')
  sample_dict = assign_value(sample_dict, str_keys_2.split('.'), value_2)

  print("result: {}".format(sample_dict))

Чтобы использовать assign_value, вам нужно разделить ваш оригинальный ключ на ключи и значение [ 116] как видно выше;

0
ответ дан fixtd 18 January 2019 в 13:35
поделиться

Есть три шага:

  1. Разделить строку пары ключ-значение на полностью определенный ключ и значение.
  2. Разделите ключ на компоненты пути.
  3. Пройдите по словарю, чтобы найти соответствующее значение для обновления.

Вот пример того, как может выглядеть код:

# Split by the delimiter, making sure to split once only
# to prevent splitting when the delimiter appears in the value
key, value = str_key_n.split("=", 1)

# Break the dot-joined key into parts that form a path
key_parts = key.split(".")

# The last part is required to update the dictionary
last_part = key_parts.pop()

# Traverse the dictionary using the parts
current = a
while key_parts:
  current = current[key_parts.pop(0)]

# Update the value
current[last_part] = value
0
ответ дан wilsonzlin 18 January 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: