for row, instrument in enumerate(instruments):
for col, value in enumerate(instrument):
self.table.SetValue(row, col, value)
答案 0 :(得分: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
答案 1 :(得分:2)
根本问题不在于这个循环。
基本问题是:
1)这个instruments
结构来自何处,为什么需要对其进行重新组织?
2)您呼叫self.table
的{{1}}结构是什么?
3)你打算用这个SetValue
结构做什么?
在回答这些问题之前,您的示例Python代码没有可以评估它的上下文。这只是代码。
答案 2 :(得分: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
因为那就是你的样子 做。
@ [Ben Hughes]的评论我指的是:
我需要明确地调用SetValue(它的 在PyGridTableBase上)为每个值 - 因为这个代码是通过扭曲调用的 推迟的方法 - 我的大脑并不多 擅长整齐的循环/枚举 方式..... - Ben Hughes
答案 3 :(得分:-3)
一个选项是使用列表理解:
[self.table.setValue(row, col, value)
for row, instrument in enumerate(instruments)
for col, value in enumerate(instrument)]
不确定它是否是更整洁或更多的pythonic ......但它是表达循环的另一种方式。
有人可能会争辩说列表理解更清晰,因为“action”部分(setValue)位于第一位/顶部。而不是被埋在循环中。
修改强>
另一种方法,使用辅助函数和生成器表达式:
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(任何()将在第一个True上停止迭代),则辅助函数可以是内置的any()。