#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 проблемами:
- Как сопоставить ключи со значениями? (В противном случае я вставляю циклы for поверх
result.item[][]
) - Как вернуть значение в виде целого числа?
Я довольно новичок в 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]