【问题标题】:Python: Storing a string into an array seems to shift the string indices?Python:将字符串存储到数组中似乎会改变字符串索引?
【发布时间】:2017-05-02 17:59:52
【问题描述】:

我正在尝试使用朴素贝叶斯存储用于 ocr 检测的数据字符串。数据是一个尺寸为 29 X 28 的字符串。它看起来像这样:

        ++#####++       
    ++######++          
    ####+++             
    +##                 
    +##+                
     +#+                
     +#++++             
    +######++           
   +###+++####+         
   +#+     ++###+       
              +##+      
               +##+     
                +##+    
                 +##    
                  +#    
                 +##    
    ++          ++#+    
   +#+      ++++##+     
   +###++#+#####++      
    +++####++++      

要读取这些数据并将其存储到整数数组中,我尝试将 .replace '#' 和 '+' 与 '1' 和 '\n' 以及空格加 0。但是,当我尝试重建读入数组后的图像。我得到的是这样的:

 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]          
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1]
 [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1]
 [1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]
 [1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]
 [1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]] 

我不明白为什么我得到一个乱码输出。我使用的代码是:

lines = data.read()


def split28(s, n):
    for begin in range(0, len(s), n):
        yield s[begin:begin+n]


zoenum = []         #strings are immutable
val_zoenum = []


for digit in split28(lines, 812):
    zoenum.append(digit)

for i in range(len(zoenum)):
        zoenum[i] = zoenum[i].replace("\n", " ")        
        zoenum[i] = zoenum[i].replace("+", "1").replace("#", "1").replace(" ", "0")
        zoenum[i] = list(map(int, zoenum[i]))

zoenum 是此类数据字符串的列表。任何想法/建议表示赞赏。另外,如果我需要重组问题,请告诉我。

【问题讨论】:

  • 您确定输入不包含制表符或任何非空格空格吗?
  • 很难说。 data.read() 没有给你行列表,它给你一个大字符串,可以解释为字符的迭代器。
  • 输入确实包含空格(空格),我用 0 替换。 @汤米
  • 是的,这就是我将其转换为整数列表的原因。 @Eric Duminil
  • 在您的示例代码中,您不会在任何地方使用lines。你为什么拥有它? zoenum 包含什么?在运行循环之前print(repr(zoenum)) 的输出是什么?之后呢?

标签: python arrays string


【解决方案1】:

您需要确保您调用的 line 确实是一行。如果您有文件对象,请使用readlines() 而不是read,或者使用以下语法:

with open('filename.txt') as file:
    for line in file:
        print(line)
        # do something with line

使用推导式创建新列表可能比尝试就地修改列表更容易。

以下是脚本中包含数据的示例:

text = """        ++#####++
    ++######++
    ####+++
    +##
    +##+
     +#+
     +#++++
    +######++
   +###+++####+
   +#+     ++###+
              +##+
               +##+
                +##+
                 +##
                  +#
                 +##
    ++          ++#+
   +#+      ++++##+
   +###++#+#####++
    +++####++++         """

for line in text.splitlines():
    print([0 if x == ' ' else 1 for x in line])

它输出:

[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

与:

for line in text.splitlines():
    print(''.join('0' if x == ' ' else '1' for x in line))

它输出:

000000001111111110000000
000011111111110000000000
000011111110000000000000
000011100000000000000000
000011110000000000000000
000001110000000000000000
000001111110000000000000
000011111111100000000000
000111111111111000000000
000111000001111110000000
000000000000001111000000
000000000000000111100000
000000000000000011110000
000000000000000001110000
000000000000000000110000
000000000000000001110000
000011000000000011110000
000111000000111111100000
000111111111111111000000
000011111111111000000000

请注意,尺寸是 24x20,而不是 29x28。

【讨论】:

  • 您应该将x is ' ' 更改为x == ' ',因为您的意思是测试相等性而不是身份。 (Python 正在实习单个字符串可能是一个很好的实现细节,但我认为这可能应该保存为以后可能的优化。)
猜你喜欢
  • 2020-09-20
  • 2015-03-08
  • 2019-11-23
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多