2016-11-26 58 views
1

我有一個整數二維數組和IM嘗試進行替換的字符,而不是在二維數組的選擇元素和二維矩陣蟒蛇指定字符

的整數,但輸出混淆了我,我不能找到

在代碼

(1, [(1, 'A'), (3, 4), (5, 6), (6, 5), (9, 2), (4, 9), (4, 2), (2, 9)]) 
(3, [(1, 'A'), (3, 'C'), (5, 6), (6, 5), (9, 2), (4, 9), (4, 2), (2, 9)]) 
(2, [(1, 'A'), (3, 'C'), (5, 6), (6, 5), (9, 2), (4, 9), (4, 2), (2, 'B')]) 

這裏錯誤的命令是代碼

import numpy as np 
    x = [ (1,2),(3,4),(5,6),(6,5),(9,2),(4,9),(4,2),(2,9) ] 
    list (x) 
    #print x 
    #x[4] = x[0][1], 'A' 
    #print x 

    #x =[1,2,3,4,5,6,7,8,9] 
    r=len(x) 
    i=0 
    j=0 
    #print "length",r 
    for i in range(0,r): 
    for j in range(0,1): 
    if x[i][j]==1: 
     x[i]=x[i][j],'A' 
     print (x[i][j], x) 

    if x[i][j] == 2: 
     x[i] = x[i][j], 'B' 
     print (x[i][j], x) 

    if x[i][j] == 3: 
     x[i]=x[i][j] , 'C' 
     print (x[i][j], x) 

print i,j 

例如第一2D(1,2)的一個應與「A」被替換...

預期的結果是

與等效替換字符的這個流的例如本條件後輸出爲: x = [(B,D),(C,D),(E,F),(F,E),(I,B),(D,I),(D,B), B,I)]

在此先感謝

+0

使用'print()'來查看變量的值,即。 '我','j','x [i]','x [i] [j]'等等 - 它有助於發現問題。 – furas

+0

顯示(有問題)預期結果。 – furas

+0

爲什麼要輸入numpy? – hpaulj

回答

2

在交互式會話:

用一個簡單的x,和用於初始迭代循環(一個或多個):

In [461]: x=[(1,2)] 
In [462]: x[0]=x[0][0],'A' 
In [463]: x 
Out[463]: [(1, 'A')] 

注意,x[0]元組已經換成一個新的元組,(x[0][0],'A'),第一元組元素加上字母。您的文字描述聽起來像是想將其更改爲('A',2),然後是('A','B')

第二,迭代的j是什麼?你真的想要range(2)

In [465]: list(range(0,1)) 
Out[465]: [0] 

==============

如果你有一個列表的列表,更換子列表元素很簡單:

In [468]: x=[[1,2]] 
In [469]: i=0 
In [470]: for j in range(2): 
    ...:  if x[i][j]==1: 
    ...:   x[i][j]='A' 
    ...:  elif x[i][j]==2: 
    ...:   x[i][j]='B' 
    ...:   
In [471]: x 
Out[471]: [['A', 'B']] 

做類似的東西元組列表更加棘手,因爲您不會更改元組的元素;你必須替換整個元組。事實上,它可能是簡單的把數組到臨時列表:

In [476]: x=[(1,2)] 
In [477]: i=0 
In [478]: x1 = list(x[i]) 
    ...: for j in range(2): 
    ...:  if x1[j]==1: 
    ...:   x1[j]='A' 
    ...:  elif x1[j]==2: 
    ...:   x1[j]='B' 
    ...: x[i]=tuple(x1) 
In [479]: x 
Out[479]: [('A', 'B')] 

==========================

爲適用於像元組的列表:

In [622]: x = [ (1,2),(3,4),(5,6),(6,5),(9,2),(4,9),(4,2),(2,9) ] 

我可以換我的代碼在功能

In [623]: def foo(y): 
    ...:  x1 = list(y) 
    ...:  for j in range(len(x1)): 
    ...:  if x1[j]==1: 
    ...:    x1[j]='A' 
    ...:  elif x1[j]==2: 
    ...:    x1[j]='B' 
    ...:  return tuple(x1) 
    ...: 

,並用一個簡單的列表理解應用到每個元組。 (它也可以編碼爲原地替換,但理解更漂亮。

In [625]: def foo1(y): 
    ...:  x1 = list(y) 
    ...:  for j in range(len(x1)): 
    ...:  x1[j] = chr(x1[j]+ord('A')-1) 
    ...:  return tuple(x1) 
    ...: 
In [626]: [foo1(y) for y in x] 
Out[626]: 
[('A', 'B'), 
('C', 'D'), 
('E', 'F'), 
('F', 'E'), 
('I', 'B'), 
('D', 'I'), 
('D', 'B'), 
('B', 'I')] 

我可以進一步簡化功能:

def foo2(y): 
    return tuple(chr(j+ord('A')-1) for j in y) 

In [624]: [foo(y) for y in x] 
Out[624]: [('A', 'B'), (3, 4), (5, 6), (6, 5), (9, 'B'), (4, 9), (4, 'B'), ('B', 9)] 

我可以在其他字母來foo,或者我可以使用chr()ord()簡化它甚至把它放在一個理解:

[tuple(chr(j+ord('A')-1) for j in y) for y in x] 
+0

對不起,但你的答案分別在x [(1,2)] >>>我想要什麼是應用這個算法在這個流x = [(2,4),(3,4),(5,6) ,(6,5),(9,2),(4,9),(4,2),(2,9)] 所以我需要替換這個整數字符取決於等於的條件 – Mohamed

+0

但你正在單獨處理每個元組,對嗎?我只是用一個較短的列表來說明任務。當然,您可以將該解決方案應用於較長列表的各個元素。 – hpaulj

+0

編輯期望的輸出>>>>但當我將它應用於整數流時,它只分配前兩個元素 (1,2) - hpaulj – Mohamed