Консенсус заключается в использовании словаря для этого - см. другие ответы. Это хорошая идея для большинства случаев, однако есть много аспектов, связанных с этим:
Тем не менее, я реализовал variable variables manager -класс, который предоставляет некоторые из вышеперечисленных идей. Он работает для python 2 и 3.
Вы использовали бы класс следующим образом:
from variableVariablesManager import VariableVariablesManager
myVars = VariableVariablesManager()
myVars['test'] = 25
print(myVars['test'])
# define a const variable
myVars.defineConstVariable('myconst', 13)
try:
myVars['myconst'] = 14 # <- this raises an error, since 'myconst' must not be changed
print("not allowed")
except AttributeError as e:
pass
# rename a variable
myVars.renameVariable('myconst', 'myconstOther')
# preserve locality
def testLocalVar():
myVars = VariableVariablesManager()
myVars['test'] = 13
print("inside function myVars['test']:", myVars['test'])
testLocalVar()
print("outside function myVars['test']:", myVars['test'])
# define a global variable
myVars.defineGlobalVariable('globalVar', 12)
def testGlobalVar():
myVars = VariableVariablesManager()
print("inside function myVars['globalVar']:", myVars['globalVar'])
myVars['globalVar'] = 13
print("inside function myVars['globalVar'] (having been changed):", myVars['globalVar'])
testGlobalVar()
print("outside function myVars['globalVar']:", myVars['globalVar'])
Если вы хотите разрешить переписывание переменных с помощью только тот же тип:
myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)
Опубликовать то, что уже было сказано в комментариях: Словари - это «неупорядоченные коллекции». Они не имеют никакого порядка для своих пар ключ / значение. Период.
Если вы хотите упорядоченную коллекцию, используйте что-то другое, кроме словаря. (массив однотипных словарей - это один из способов сделать это.) Вы также можете написать код, который загружает ключи словаря в изменяемый массив, сортирует массив, а затем использует отсортированный массив ключей для выбора пар ключ / значение в желаемый порядок.
Вы также можете создать свой собственный тип коллекции, который использует строки как индексы и сохраняет элементы в отсортированном порядке. Swift делает это просто, хотя это будет дорого стоить.
Мне это понравилось.
let stagesDict = NSDictionary()
if let strVal = sleepItemDict["stages"] as? NSDictionary {
stagesDict = strVal
let sortedKeys = (stagesDict.allKeys as! [String]).sorted(by: <)
var sortedValues : [Int] = []
for key in sortedKeys {
let value = stagesDict[key]!
print("\(key): \(value)")
sortedValues.append(value as! Int)
}
}
c,d,a,e
. Таким образом, единственный способ - установить последовательность, массив json, чтобы заметить, что это тот порядок, который я хотел. Это так раздражает. На каком-то языке у них нет этой проблемы. Например, это PHP. – TomSawyer 12 July 2016 в 21:14OrderedDictionary
, но бесполезно работать с json, потому что мы должны сначала заказать словарь. – TomSawyer 13 July 2016 в 06:32