Предположим, что у вас есть JSON, подобный этому
[
{
"type": "qrcode",
"symbol": [
{
"seq": 0,
"data": "HelloWorld9887725216",
"error": null
}
]
}
]
Чтобы разобрать вышеупомянутый JSON в единстве, вы можете создать такую модель JSON.
[System.Serializable]
public class QrCodeResult
{
public QRCodeData[] result;
}
[System.Serializable]
public class Symbol
{
public int seq;
public string data;
public string error;
}
[System.Serializable]
public class QRCodeData
{
public string type;
public Symbol[] symbol;
}
И затем просто проанализировать следующим образом ...
var myObject = JsonUtility.FromJson("{\"result\":" + jsonString.ToString() + "}");
Теперь вы можете изменить JSON / CODE в соответствии с вашими потребностями. https://docs.unity3d.com/Manual/JSONSerialization.html
Попробуйте это:
[(i, j) for i, j in enumerate(mylist)]
Вам нужно поместить i,j
внутри кортежа, чтобы работа над списком работала. Альтернативно, учитывая, что enumerate()
уже возвращает кортеж, вы можете вернуть его напрямую, не распаковывая его сначала:
[pair for pair in enumerate(mylist)]
В любом случае результат, который возвращается, как ожидается :
> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
Если вы используете длинные списки, это выглядит быстрее, чем указано в списке.
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "list(enumerate(mylist))"
1000000 loops, best of 3: 1.61 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[(i, j) for i, j in enumerate(mylist)]"
1000000 loops, best of 3: 0.978 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[t for t in enumerate(mylist)]"
1000000 loops, best of 3: 0.767 usec per loop
[t for t in enumerate(my list)]
еще быстрее.
– the wolf
27 May 2012 в 23:58
Будьте ясны относительно кортежей.
[(i, j) for (i, j) in enumerate(mylist)]
Или, если вы не настаиваете на использовании понимания списка:
>>> mylist = ["a","b","c","d"]
>>> list(enumerate(mylist))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
Все великие парни. Я знаю, что вопрос здесь специфичен для перечисления, но как насчет чего-то подобного, просто еще одна перспектива
from itertools import izip, count
a = ["5", "6", "1", "2"]
tupleList = list( izip( count(), a ) )
print(tupleList)
. Он становится более мощным, если нужно параллельно перебирать несколько списков с точки зрения производительности. Просто мысль
a = ["5", "6", "1", "2"]
b = ["a", "b", "c", "d"]
tupleList = list( izip( count(), a, b ) )
print(tupleList)
Вот как это сделать:
>>> mylist = ['a', 'b', 'c', 'd']
>>> [item for item in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
В качестве альтернативы вы можете сделать:
>>> [(i, j) for i, j in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
Причина, по которой вы получили сообщение об ошибке, заключалась в том, что вы отсутствовали () вокруг i
и j
, чтобы сделать его кортежем.
Чтобы быть действительно ясным, это не имеет никакого отношения к enumerate
и ко всему, что относится к синтаксису понимания списка.
Это понимание списка возвращает список кортежей:
[(i,j) for i in range(3) for j in 'abc']
это список dicts:
[{i:j} for i in range(3) for j in 'abc']
список списков:
[[i,j] for i in range(3) for j in 'abc']
синтаксическая ошибка:
[i,j for i in range(3) for j in 'abc']
Что (IMHO) и путают с синтаксисом понятий словаря:
>>> {i:j for i,j in enumerate('abcdef')}
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}
И набор кортежей:
>>> {(i,j) for i,j in enumerate('abcdef')}
set([(0, 'a'), (4, 'e'), (1, 'b'), (2, 'c'), (5, 'f'), (3, 'd')])
Как заявил Оскар Лопес, вы можете просто передать нумерацию кортежа напрямую :
>>> [t for t in enumerate('abcdef') ]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')]
,
, а не()
. Таким образом, «положитьi,j
внутри кортежа») не имеет смысла, посколькуi,j
уже является кортежем! Проблема заключается в том, что парсеру списка list требуется паренс для группы операторов. – cowbert 2 October 2017 в 23:40