for row, instrument in enumerate(instruments):
for col, value in enumerate(instrument):
self.table.SetValue(row, col, value)
ответ
Вы упомянули в комментариях, что этот цикл является частью асинхронной функции (с точки зрения скрученной структуры). В этом случае вы не хотите блокировать в течение длительного времени:
from twisted.internet import task
for i, row in enumerate(instruments):
task.coiterate(self.table.SetValue(i, j, v) for j, v in enumerate(row))
Таким образом, все строки назначаются параллельно.
Примечание:
- Берегитесь позднее связывание для
i
иrow
. В этом случае используйте(lambda i=i, row=row: ...)()
. task.coiterate()
использует глобальный объект, поэтому одновременно может быть несколько обновлений таблиц (это может быть не то, что вы хотите).
Вот @SilentGhost' answer (удалена):
self.table = instruments
Потому что это то, что вы, кажется, делать.
И замечание @ [Бен Хьюз] Я имею в виду:
Мне нужно позвонить SetValue в явной форме (ее на PyGridTableBase) для каждого значения - , как этот код вызывается через витой отложенного метода - мой мозг не так много хорошо перекручивание/перечисления в аккуратном пути ..... - Бен Хьюз
Как я пишу этот комментарий, комментариев не спрашивают ни на вопрос, ни на какие-либо из существующих ответов. В этом контексте я отмечаю, что SilentGhost удалил свой оригинальный ответ :-). Было бы очень неплохо, если бы вопроситель обновил свой вопрос с любой соответствующей информацией. –
@John Machin: Я включил удаленный ответ и комментарий для справки. – jfs
Спасибо за разъяснение. SO действительно нуждается в альтернативе удалению сообщений - «Я бы хотел, чтобы я никогда не писал эту кнопку» :-) - помимо проблем, подобных остальным другим ответам, относящимся к тонкому воздуху, я заметил случаи, когда ответ, который приобрел upvotes в в ранние часы его жизни, но позже было показано, что они неверны, должны быть сданы точки репутации, но текст остался там, потому что в других ответах есть ссылки на него. –
Одним из вариантов является использование списка понимание:
[self.table.setValue(row, col, value)
for row, instrument in enumerate(instruments)
for col, value in enumerate(instrument)]
Не уверен, если это какая-то аккуратнее или более вещий ... Но это еще один способ выразить петлю.
Можно утверждать, что понимание списка более четкое, так как элемент «действие» (setValue) помещается первым/вверху. Вместо того, чтобы быть похороненным внутри петли.
EDIT:
Еще один способ, с помощью вспомогательной функции и выражение генератора:
def loop(iterator):
for item in iterator: pass
loop(self.table.setValue(row, col, value)
for row, instrument in enumerate(instruments)
for col, value in enumerate(instrument))
Вспомогательная функция может быть встроенной в любой(), если вы знаете наверняка, что тело цикла никогда не будет оценивать True в булевом контексте (any() остановит итерацию на первом True).
это, безусловно, менее читаемо. – SilentGhost
Вы так думаете? Утверждения абсолютно одинаковы, только упорядочены по-разному и завернуты в [] – codeape
. Говоря об этом, я никогда не использовал понимание списков таким образом самостоятельно. Кажется немного странным, чтобы не '' variable = [...] '', а только '' [...] '' без использования возвращаемого значения. – codeape
То, что вы вызываете row
, не является строкой, это индекс строки. instrument
- это строка. Кроме того:
Если единственный инструмент, который у вас есть это SetValue(row_index, column_index, value)
метод и этот метод делает больше, чем помочь повторить структуру instruments
кропотливо и instruments
сбор не является, как ваш код описывает, то нет лучше путь. Это уже намного лучше, чем
#WARNING: BAD PRACTICE! DON'T USE THIS CODE!
for row_index in xrange(len(instruments)):
instrument = instruments[row_index]
for column_index in xrange(len(instrument)):
self.table.SetValue(row_index, column_index, instrument[column_index])
или любые извращения.
В противном случае вы можете быть заинтересованы в import copy; self.table = copy.copy(instruments)
или даже (как SilentGhost предложил) self.table = instruments
Принципиальный вопрос не касается этого цикла.
Фундаментальные вопросы таковы:
1) Где это instruments
структура пришли, и почему вам нужно реорганизовать его?
2) Что это такое? self.table
Структура, по которой вы звоните SetValue
?
3) Что вы собираетесь делать с этой структурой self.table
?
Пока вы не ответите на эти вопросы, ваш образец кода Python не имеет контекста, в котором его можно оценить. Это всего лишь код.
- 1. Enum.Parse(), конечно, более аккуратный способ?
- 2. Более аккуратный способ дезинфекции входа?
- 3. Что такое более питонический способ сделать это?
- 4. Как сделать код более pythonic?
- 5. Что такое Pythonic способ сделать это?
- 6. Что такое pythonic способ распаковать кортежи?
- 7. Что такое pythonic способ setattr() для модуля?
- 8. Что такое pythonic способ генерации ряда символов?
- 9. Есть ли у Pythonic способ сделать эту логику более элегантной?
- 10. Что такое более эффективный способ совершения столкновений?
- 11. Что такое более чистый, более элегантный способ инициализации всего этого?
- 12. Более элегантный/Pythonic способ печати элементов кортежа?
- 13. Как сделать синтаксис конструктора C# более pythonic?
- 14. Что такое более быстрый способ подсчета отношений?
- 15. Что такое более эффективный способ классификации треугольников?
- 16. Более Pythonic способ отображения заголовка в терминале
- 17. Более короткий и более Pythonic способ выбрать элемент из списка
- 18. Что такое pythonic способ иметь условное затенение?
- 19. Использование списков, чтобы сделать funcion более pythonic
- 20. Как я могу сделать это более Pythonic?
- 21. Как выполнить следующее вычисление в более элегантном (и Pythonic) пути?
- 22. Есть ли более элегантный способ сделать следующее в C++ 11?
- 23. python Как сделать этот код более pythonic?
- 24. Что такое Pythonic способ реализовать простой FSM?
- 25. Что такое pythonic способ пропустить родительский метод?
- 26. Что такое pythonic способ вычисления argmax?
- 27. Что такое Pythonic способ сделать неблокирующую версию объекта?
- 28. Что такое pythonic способ передать аргументы функции?
- 29. Более быстрое перечисление: использование массива Перечисление
- 30. Вставьте данные в Laravel 5 - более аккуратный способ?
выглядит аккуратным и Pythonic достаточно для меня ;-) – pkit
не связал вас с вашим вопросом, но инструменты и инструменты переменных выглядят слишком похожими, что усложняет отладку. http://www.joelonsoftware.com/articles/Wrong.html –
Что вам не нравится? Что с этим не так? Какая оптимизация, по вашему мнению, возможна? –