2015-12-06 34 views
-1

問題是,從下面這樣的列表中返回一個包含所有出現數字2的元組的元組對於列表中的給定索引。如果有X連續2秒,那麼它應該只有一個元素在裏面的元組出現一個包含X,就像這樣:列表中特定元素的總和(如果它們是連續的)(python)

[[1, 2, 2, 1], 
[2, 1, 1, 2], 
[1, 1, 2, 2]] 

給人

((1,), (1,), (1, 1),(2,)) 

雖然

[[2, 2, 2, 2], 
[2, 1, 2, 2], 
[2, 2, 1, 2]] 

給與

((3,),(1, 1),(2,)(3,)) 

同樣的事情,但不是列,這次,對於行呢?有沒有一種「單線」方法來做到這一點?我的意思是:

[[1, 2, 2, 1], 
[2, 1, 1, 2], 
[1, 1, 2, 2]] 

給人

((2,), (1, 1), (2,)) 

雖然

[[2, 2, 2, 2], 
[2, 1, 2, 2], 
[2, 2, 1, 2]] 

給人

((4,),(1, 2),(2, 1)) 

我嘗試過的一些事情,這是一件事,我能夠「T完成它,不知道該怎麼辦了,後:

l = [[2,2,2],[2,2,2],[2,2,2]] 
t = (((1,1),(2,),(2,)),((2,),(2,),(1,1))) 

if [x.count(0) for x in l] == [0 for x in l]: 
     espf = []*len(l) 
     espf2 = [] 
     espf_atual = 0 
     contador = 0 
     for x in l: 
      for c in x: 
       celula = x[c] 
       if celula == 2: 
        espf_atual += 1 
       else: 
        if celula == 1: 
         espf[contador] = [espf_atual] 
         contador += 1 
         espf_atual = 0 
     espf2 += [espf_atual] 
     espf_atual = 0 
    print(tuple(espf2)) 

輸出 (3,3,3)

這個輸出是正確的,但如果我更改列表( l)它不起作用

+0

您可以向我們展示迄今爲止嘗試的操作嗎?我們不是在這裏爲你編碼,我們在這裏幫你編碼。 –

+0

剛寫了你問的 – Pevides

+0

Thx。現在,從這裏開始,您的第一個「if」確保您沒有任何列表中的任何0。這是一個要求嗎?如果你在列表中輸入任何'0',它將會失敗。其次,它只適用於所有'2'行。這是因爲你正在(espf [contador]]中存儲(正確)中間結果,但你以後沒有做任何事情。你只使用'espf_actual'來使用最後一次出現的'2'。 –

回答

0

所以,你在代碼中有som錯誤。

  1. 索引:

    for c in x: 
        celula = x[c] 
    

    應該celula = cc已經指出的x每個元素。

  2. 中間結果

    爲你存儲中間結果爲每列:

    espf_atual = 0 
    ... 
    espf_atual += 1 
    ... 
    espf2 += [espf_atual] 
    

    但這隻會讓存儲的2最後出現的每一列。這是,如果一行是[2,1,2,2],那麼espf_actual = 2,你將只存儲最後一次出現。您將覆蓋第一次出現(在1之前)。

    爲了避免這種情況,您需要存儲每行的中間結果。你用espf = []*len(l)獲得了一半,但你以後從未使用過它。

查找波紋管的工作示例(不是太從最初的解決方案不同):

espf = [] 

for x in l: 
    # Restart counters for every row 
    espf_current = [] # Will store any sequences of 2 
    contador = 0  # Will count consecutive 2's 

    for c in x: 
     celula = c 
     if celula == 2: 
      contador += 1 # Count number of 2 
     elif celula == 1: 
      if contador > 0: # Store any 2 before 1 
       espf_current += [contador] 
      contador = 0 
    if contador > 0:   # Check if the row ends in 2 
     espf_current += [contador] 

    # Store results of this row in the final results 
    espf += [tuple(espf_current)] 
print tuple(espf) 

切換行和列的關鍵,是要改變索引方法。目前,您正在迭代列表中的元素,因此,這不允許您在行和列之間切換。

另一種方式看迭代迭代矩陣(i, j爲行和列)的指標如下:

numRows = len(l) 
numCols = len(l[0]) 

for i in range(numRows): 
    for j in range(numCols): 
     celula = l[i][j] 

以上等同於前面的代碼索引。它假定所有行都具有相同的長度(這在您的示例中是正確的)。將它從行更改爲列很簡單(提示:切換循環),我將它留給您:P

+0

這樣的行,那麼關於collumns?我應該在哪裏改變什麼?我需要另一個循環的權利? – Pevides

+0

@Pevides我更新了一些提示的帖子。希望能幫助到你! –

相關問題