2013-03-25 160 views
1

是否可以更新/修改循環中的列表元素/項目?在這裏,我要修改t修改循環中的列表元素

n_wk=[1,2,3,2,3,4,2,3] 
t=['a','a','a','a','a','a','a','a'] 

for i in range(len(n_wk)): 
    if i==0: 
     continue 
    if n_wk[i]<n_wk[i-1]: 
     if t[i]=='a': 
      t[i]='b' 
     elif t[i]=='b': 
      t[i]='c' 
    if n_wk[i]>n_wk[i-1]: 
     t[i]=t[i-1] 

我期待輸出t = ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c']的項目。但是,輸出結果是t=['a', 'a', 'a', 'b', 'b', 'b', 'b', 'b']。好像list t沒有在循環中得到更新。

我們能不能更新循環中列表的項目/元素?

+0

顯然在循環中更新't',因爲您已將'a'值替換爲'b'值。你對'elif'匹配的期望是不正確的。 – 2013-03-25 20:58:20

+0

使用[list comprehension](http://www.youtube.com/watch?v=pShL9DCSIUw)並改爲創建一個新列表。按指數循環播放是慢速的 - 速度慢,難以閱讀和不靈活。 – 2013-03-25 21:00:35

+0

不應該在'if'n_wk [i] Zero 2013-03-25 21:03:05

回答

1

你的列表t確實得到修改:

# t before loop 
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'] 
# t after loop 
['a', 'a', 'a', 'b', 'b', 'b', 'b', 'b'] 

然而,在你的代碼的微小變化會給你你正在尋找的結果是:

for i in range(len(n_wk)): 
    if i == 0: 
     continue 
    if n_wk[i] < n_wk[i-1]: 
     if t[i-1] == 'a': #changed from t[i] 
      t[i] = 'b' 
     elif t[i-1] == 'b': #changed from t[i] 
      t[i] = 'c' 
    if n_wk[i] > n_wk[i-1]: 
     t[i] = t[i-1] 

print(t) 
# ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'] 
0

這裏有沒有一個方法循環使用索引並且不要求t'a' s初始化爲:

n_wk = [1,2,3,2,3,4,2,3] 
t = [] 

n_prev = 0 
t_prev = 'a' 

for n in n_wk: 
    t_new = t_prev 
    if n < n_prev: 
     if t_prev == 'a': 
      t_new = 'b' 
     elif t_prev == 'b': 
      t_new = 'c' 
    t.append(t_new) 
    n_prev = n 
    t_prev = t_new 

print(t)