2012-02-24 106 views
2

編輯:我已經改變了我的問題稍微使之更加普遍,從而在P中的I [i] [j]也可以改變。優雅的方式來操縱列表中的列表?

很新的Python的。我有一個列表,這使得4排5列網格內[長度相等]列表:

p = [[1.0, 3.0, 4.0, 1.0, 1.0], 
    [1.0, 1.0, 5.0, 1.0, 1.0], 
    [1.0, 6.0, 6.0, 1.0, 1.0], 
    [1.0, 4.0, 1.0, 1.0, 6.0]] 

爲了操縱每個單元格,我現在正在做的是這樣的:

for i in range(len(p)): 
    for j in range(len(p[0])): 
     p[i][j] = p[i][j - 1] * c1 + p[(i + 1) % len(p)][j] * c2 

我的問題是:有沒有更好的方法來寫這個,而不是在另一個for循環中有for循環?也許使用lambda?

+0

你想對細胞做什麼?我大概可以從你正在做的事情中弄清楚你的意圖,但這並不明顯。 – Kimvais 2012-02-24 14:11:09

+0

我想像在代碼中一樣操縱它們:'p [i] [j] = p [i] [j - 1%len(p [0])] * c1 + p [i] [j] * c2'但我想擺脫在一個for。 – ksindi 2012-02-24 14:12:08

+0

也許用'xrange'替代'range'。 – hochl 2012-02-24 14:12:44

回答

2

如果你不想要兩個嵌套的循環,你可以遍歷行和使用「列表理解」構建每次更換行(這也恰好使用關鍵字for):

​​

由於你是新來的蟒蛇,我會添加一些建議:

一)沒有什麼錯誤使用兩個嵌套的for循環。在我看來,他們是編寫你的例子的最好(最清晰,最優雅)的方式。

b)你要明白,1%LEN(P [0])是常數,是嗎?但你可能沒有意識到即使在p只有一列的情況下(因爲索引-1工作的方式)row[i- 1%len(row)] == row[i-1]

c)有人提出了看numpy數組的好建議(但刪除了回答)。我第二它。

0

使用的maplambda組合可能做的伎倆。

2

可以遍歷不使用索引:

for row in p: 
    for j in range(len(row)): 
     row[j] = row[j - 1 % len(row)] * c1 + row[j] * c2 

我讓你來決定是否有讓你在同一行上運行一個更好的辦法。

如果你想行和列之間進行交叉參考,則沒有,有沒有更好的特別的方式來做到這一點,除非你想使用類似numpy的。

+0

感謝您的回覆。我已經稍微改變了我的問題,以使它更一般化,從而我在p [i] [j]中的i也可以改變。 – ksindi 2012-02-24 14:34:08