Python: добавьте номер позиции в строковый элемент в списке [duplicate]

Предположим, что у вас есть 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

103
задан Simeon Visser 21 August 2012 в 23:45
поделиться

7 ответов

Попробуйте это:

[(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')]
138
ответ дан Óscar López 21 August 2018 в 12:57
поделиться
  • 1
    Не обязательно быть кортежем. Любое выражение, использующее i и j, которое возвращает значение, будет – Alvaro 26 July 2014 в 16:02
  • 2
    использование перечисления велико, как сделать его более эффективным с помощью itertools – Pramit 28 November 2016 в 23:29
  • 3
    Просто помните, что кортеж построен , , а не (). Таким образом, «положить i,j внутри кортежа») не имеет смысла, поскольку i,j уже является кортежем! Проблема заключается в том, что парсеру списка list требуется паренс для группы операторов. – cowbert 2 October 2017 в 23:40

Если вы используете длинные списки, это выглядит быстрее, чем указано в списке.

~$ 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
11
ответ дан beardc 21 August 2018 в 12:57
поделиться
  • 1
    +1 Я не тестировал его, но я буду держать пари [t for t in enumerate(my list)] еще быстрее. – the wolf 27 May 2012 в 23:58
  • 2
    Просто обновил его. Ты прав. – beardc 28 May 2012 в 00:13

Будьте ясны относительно кортежей.

[(i, j) for (i, j) in enumerate(mylist)]
5
ответ дан Ignacio Vazquez-Abrams 21 August 2018 в 12:57
поделиться

Или, если вы не настаиваете на использовании понимания списка:

>>> mylist = ["a","b","c","d"]
>>> list(enumerate(mylist))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
30
ответ дан pillmuncher 21 August 2018 в 12:57
поделиться

Все великие парни. Я знаю, что вопрос здесь специфичен для перечисления, но как насчет чего-то подобного, просто еще одна перспектива

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)
0
ответ дан Pramit 21 August 2018 в 12:57
поделиться

Вот как это сделать:

>>> 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, чтобы сделать его кортежем.

8
ответ дан Simeon Visser 21 August 2018 в 12:57
поделиться

Чтобы быть действительно ясным, это не имеет никакого отношения к 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')]
39
ответ дан the wolf 21 August 2018 в 12:57
поделиться
Другие вопросы по тегам:

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