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

看起來整潔和Python的足夠我;-) – pkit 2009-12-14 10:55:48

+0

沒有連接你的問題,但變量儀器和儀器看起來太相似了,這使得調試更加困難。 http://www.joelonsoftware.com/articles/Wrong.html – 2009-12-14 11:13:45

+1

你不喜歡什麼?它出什麼問題了?你認爲什麼樣的優化是可能的? – 2009-12-14 11:16:15

回答

2

你在評論中提到這個循環是異步函數的一部分(就扭曲框架而言)。在這種情況下,您不想長時間阻塞:因此,所有行都是並行分配的。因此,所有行都是並行分配的。

注:

  • 當心爲irow後期綁定。在這種情況下使用(lambda i=i, row=row: ...)()
  • task.coiterate()使用全局對象,因此可能同時有多個表更新(它可能不是你想要的)。

這裏的@SilentGhost' answer(刪除):

self.table = instruments

因爲這是你彷彿是 做。

而由@評論[本休斯]我指的是:

我需要顯式地調用的SetValue(其 在PyGridTableBase)爲每個值 - 作爲該代碼被調用通過扭曲 遞延法 - 我的大腦是沒有太大的 擅長在一個整潔 方式循環/枚舉.....本 - 休斯

+0

當我寫這個評論時,提問者沒有評論,他的問題和任何現有的答案都沒有。在這種情況下,我注意到SilentGhost刪除了他原來的答案:-)。如果提問者用任何相關信息更新他的問題,這將是一個非常好的主意。 – 2009-12-14 20:51:53

+0

@John Machin:我已經包括刪除的答案和評論以供參考。 – jfs 2009-12-14 23:33:54

+0

感謝您的澄清。所以,我真的需要一種替代方式來刪除郵件 - 一個「我希望我永遠不會寫這個郵件」的按鈕:-) - 除了像其他答案提到稀薄空氣這樣的問題之外,我注意到了一些情況,在其生命的早期時間,但後來被證明是不正確的,應該放棄其聲譽點,但文本離開那裏,因爲在其他答案中提到它。 – 2009-12-15 05:45:21

-3

一種選擇是使用列表理解:如果

[self.table.setValue(row, col, value) 
    for row, instrument in enumerate(instruments) 
     for col, value in enumerate(instrument)] 

不知道這是任何整潔或更Python ...但它是表達循環的另一種方式。

有人可能會爭辯說,列表理解更清晰,因爲「行動」部分(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上的迭代)。

+1

它的可讀性肯定較差。 – SilentGhost 2009-12-14 11:12:15

+0

你是這麼認爲的嗎?這些陳述是完全一樣的,只是以不同的方式排列,並且封裝在[] – codeape 2009-12-14 11:13:58

+2

這就是說,我從來沒有以這種方式使用過列表理解。沒有''variable = [...]'',只有''[...]''沒有使用返回值,感覺有點奇怪。 – codeape 2009-12-14 11:18:33

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]) 

或其任何變異好得多。

否則self.table = instruments

2

的根本問題不是關於這個循環,你可能有興趣在import copy; self.table = copy.copy(instruments)甚至(如SilentGhost曾建議)。

的根本問題是:

1)凡這是否instruments結構從何而來,以及爲什麼你需要重組呢?

2)這是什麼self.table結構上你打電話SetValue

3)您打算如何處理這個self.table結構?

在您回答這些問題之前,您的示例Python代碼沒有可以評估的上下文。這只是代碼。

相關問題