Python, использующий элементы массива в качестве индексов в многомерном массиве

#python #arrays

#python #массивы

Вопрос:

Я анализирую результаты запроса SOAP (wsdl) и получаю результаты в виде массива массивов, таких как:

 [(item){
   item[] =
      (item){
         key[] =
            "cdr_id",
         value[] =
            "201407000000000431",
      },
      (item){
         key[] =
            "cdr_date",
         value[] =
            "2014-07-07 07:47:12",
      },
... (snipped for brevity - 81 items in total)
      (item){
         key[] =
            "extradata",
         value[] = <empty>
      },
 }]
  

Мне нужно извлечь единственное значение, соответствующее определенному ключу.
Я столкнулся с 2 проблемами:

  1. Как сопоставить ключи со значениями? (В противном случае я вставляю циклы for поверх result.item[][] )
  2. Как вернуть значение в виде целого числа?

Я довольно новичок в python, поэтому заранее прошу прощения, если вопрос кажется слишком простым.

Мой текущий код выглядит немного как:

 success_calls =  client.service.selectRowset(tables[table], sfilter, None, None, None)[1]
total_time = calls_num = 0
for call in success_calls:
   for key in range(len(call.item)):
       if call.item[key][0] is "elapsed_time":
           item_value = call.item[key][1]
   total_time  = int(item_value)
  

Ответ №1:

Вы можете создать Dictionary для всех этих значений для доступа к определенным значениям с помощью определенного ключа. Словари — это реализация python хэшированных таблиц. Обратите внимание, что это имело бы смысл только в том случае, если вы хотите обращаться к словарю несколько раз, потому что вам нужно пробежаться по вашему массиву во время создания хэш-таблицы и вычислить хэш-значение для каждой записи. Если вы хотите извлечь только одно значение, лучшим решением будет выполнить обработку массива, как вы уже делаете в своем примере кода. В худшем случае у вас возникает сложность O(n) .

Вы можете легко преобразовать строку в целое число в python с помощью int("12345") . Но будьте осторожны. Это может вызвать ValueError исключение, если ваша строка не может быть преобразована в integer. Если ваше elapsed_time действительное число, а не натуральное, которое вы можете разобрать, использует float("22.2123")

Комментарии:

1. результатом success_calls является 14 массивов, каждый из которых содержит 81 «элемент». Я перебираю элементы 14×81 вместо использования одного и того же словаря, если только я не понимаю, как работают словари. В любом случае — я новичок в python — я пытался dict(success_calls) и dict(success_calls.item), но не смог понять, как назначить массивы ключей и значений. что касается последнего вопроса — ответы (по крайней мере, в том виде, в котором они просматриваются с помощью print item_value) заключены в квадратные скобки [] — это целое число, но из-за скобок, когда я пытаюсь ввести его в int(), я не получаю значения.

2. 81 встроен — это всегда одни и те же элементы, разные значения. Количество success_calls является переменным и может достигать нескольких тысяч на загруженном сервере.

3. Хорошо, если ваш ответ заключен в квадратные скобки, вам нужно только выбрать первое поле для int() it … таким образом: int(item_value[0]). Похоже, что value — это другой массив. Как я только что упомянул: словари полезны (с точки зрения производительности) только в том случае, если вы хотите получить к ним доступ несколько раз. Интерпретатору приходится прогонять весь массив и хэшировать каждую отдельную запись, чтобы создать его. Вы сказали, что хотите извлечь только одно значение. Таким образом, решение с использованием вложенных циклов должно быть дешевле, чем создание словаря.

4. Вы сказали, что эти 81 запись являются встроенными. Всегда ли тег «elapsed_time» также отображается в одной и той же позиции в call.item? если да, вы можете удалить второй цикл for и получить к нему прямой доступ. например, если он всегда отображается в 66-й позиции item_value = call.item[66][1]

5. Я уже принял этот ответ, но просто для полноты картины — в конце я просто выполнил item_value = call[34][1][0]