2009-12-14 3 views
1
for row, instrument in enumerate(instruments): 
    for col, value in enumerate(instrument): 
     self.table.SetValue(row, col, value) 
+3

выглядит аккуратным и Pythonic достаточно для меня ;-) – pkit

+0

не связал вас с вашим вопросом, но инструменты и инструменты переменных выглядят слишком похожими, что усложняет отладку. http://www.joelonsoftware.com/articles/Wrong.html –

+1

Что вам не нравится? Что с этим не так? Какая оптимизация, по вашему мнению, возможна? –

ответ

2

Вы упомянули в комментариях, что этот цикл является частью асинхронной функции (с точки зрения скрученной структуры). В этом случае вы не хотите блокировать в течение длительного времени:

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) для каждого значения - , как этот код вызывается через витой отложенного метода - мой мозг не так много хорошо перекручивание/перечисления в аккуратном пути ..... - Бен Хьюз

+0

Как я пишу этот комментарий, комментариев не спрашивают ни на вопрос, ни на какие-либо из существующих ответов. В этом контексте я отмечаю, что SilentGhost удалил свой оригинальный ответ :-). Было бы очень неплохо, если бы вопроситель обновил свой вопрос с любой соответствующей информацией. –

+0

@John Machin: Я включил удаленный ответ и комментарий для справки. – jfs

+0

Спасибо за разъяснение. SO действительно нуждается в альтернативе удалению сообщений - «Я бы хотел, чтобы я никогда не писал эту кнопку» :-) - помимо проблем, подобных остальным другим ответам, относящимся к тонкому воздуху, я заметил случаи, когда ответ, который приобрел upvotes в в ранние часы его жизни, но позже было показано, что они неверны, должны быть сданы точки репутации, но текст остался там, потому что в других ответах есть ссылки на него. –

-3

Одним из вариантов является использование списка понимание:

[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).

+1

это, безусловно, менее читаемо. – SilentGhost

+0

Вы так думаете? Утверждения абсолютно одинаковы, только упорядочены по-разному и завернуты в [] – codeape

+2

. Говоря об этом, я никогда не использовал понимание списков таким образом самостоятельно. Кажется немного странным, чтобы не '' variable = [...] '', а только '' [...] '' без использования возвращаемого значения. – codeape

4

То, что вы вызываете 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

2

Принципиальный вопрос не касается этого цикла.

Фундаментальные вопросы таковы:

1) Где это instruments структура пришли, и почему вам нужно реорганизовать его?

2) Что это такое? self.table Структура, по которой вы звоните SetValue?

3) Что вы собираетесь делать с этой структурой self.table?

Пока вы не ответите на эти вопросы, ваш образец кода Python не имеет контекста, в котором его можно оценить. Это всего лишь код.

Смежные вопросы