选择元素并在2D Matrix python中指定字符

时间:2016-11-26 03:54:01

标签: python arrays python-2.7 python-3.x pycharm

我有一个整数2D数组,我试图替换字符而不是

该二维数组中的整数,但输出对我来说很困惑,我找不到

代码中的错误命令

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

提前致谢

1 个答案:

答案 0 :(得分: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')

2,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 [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()来简化它:

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)

甚至完全理解:

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