Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中用于加密的二维数组_Python_Arrays - Fatal编程技术网

python中用于加密的二维数组

python中用于加密的二维数组,python,arrays,Python,Arrays,我想让用户制作一个任意大小的表格。首先,他将输入行和列的数量,然后他将为每列和每行输入一对数字,然后输入剩余单元格中的数据。这是一个例子: row\column| 23 | 54 | 34 | 75 ------------------------------------- 65 | AM | h | 9 | C ------------------------------------- 78 | 56 | in | 13

我想让用户制作一个任意大小的表格。首先,他将输入行和列的数量,然后他将为每列和每行输入一对数字,然后输入剩余单元格中的数据。这是一个例子:

row\column|  23  |  54  |  34  |  75
-------------------------------------
   65     |  AM  |   h  |   9  |  C
-------------------------------------
   78     |  56  |   in |   13 |  ok
基本上,输入所有信息后,他应该能够说7834,得到13,反之亦然(例如,输入9C,得到65346575)

我试过这个,我明白为什么它不起作用,但这是我唯一的想法

nc = int(raw_input('Input number of columns: '))
nr = int(raw_input('Input number of rows: '))

table = [[raw_input('Input two digits for each column: ') for i in range(2, nc)] for i in range(1)]
table = [[raw_input('Input two digits for each row: ') for i in range(1)] for i in range(2, nr)]
table = [[raw_input('Input data: ') for i in range(2, nc)] for i in range(2, nr)]
非常感谢您的帮助。

那样不行

事实上,我有点撒谎。它可以这样工作(我在你写的发电机上遇到了麻烦):

但这正是您在开始时要求的——您似乎希望最终用户能够输入列和行标题,然后填充数据

如果我们:

table = [[raw_input('Input data: {},{} '.format(a,b)) for a in range(0, nc)] for b in range(0, nr)]
然后我们可以得到:

Input data: 0,0 None
Input data: 1,0 1
Input data: 2,0 2
Input data: 0,1 a
Input data: 1,1 Ted
Input data: 2,1 Fred
Input data: 0,2 b
Input data: 1,2 3.214
Input data: 2,2 Copy
>>> table
[['None', '1', '2'], ['a', 'Ted', 'Fred'], ['b', '3.214', 'Copy']]
现在,方案中混乱的部分是,要在“网格”中找到坐标,必须读取每个列标题并返回其位置,然后读取每个行标题以返回其位置。然后你可以:

值=网格[r][c]

现在,要做相反的操作就更难了——您必须读取每个单元格才能返回行和列标题

哦,我们没有进行错误检查,以确保您没有输入相同的两行或两个标题,这将彻底破坏您的方案。你会需要的

另外,填写表格需要做很多工作

剩下的就是我用发电机来处理它,犯了一些教育错误

如果要使用列表列表,请执行以下操作:

row = [None for i in range(0,nc+1)]
grid = [row for i in range(0,nr+1)]
然后,这将为您提供一个列表,其中没有填充任何内容

>>> grid
[[None, None, None, None], [None, None, None, None], [None, None, None, None], [None, None, None, None]]
好的,那么请输入列标题:

>>> for ch in range (1,nc+1):
...     grid[0][ch] = raw_input("Header, Column {}".format(ch))
...
Header, Column 111
Header, Column 222
Header, Column 333
>>> grid
[[None, '11', '22', '33'], [None, '11', '22', '33'], [None, '11', '22', '33'], [None, '11', '22', '33']]
哈,为什么没用

>>> grid[0][3]="steve"
>>> grid
[[None, '11', '22', 'steve'], [None, '11', '22', 'steve'], [None, '11', '22', 'steve'], [None, '11', '22', 'steve']]
哦,是的

混蛋

import copy
row = [None for i in range(0,nc+1)]
grid = [copy.deepcopy(row) for i in range(0,nr+1)]
>>> for ch in range (1,nc+1):
...     grid[0][ch] = raw_input("Header, Column {}: ".format(ch))
...
Header, Column 1: 11
Header, Column 2: 22
Header, Column 3: 33
>>> grid
[[None, '11', '22', '33'], [None, 5, None, None], [None, None, None, None], [None, None, None, None]]
(忽略5,这是我的测试)

然后是行:

>>> for rh in range(1,nr+1):
...     grid[rh][0] = raw_input("Row Header: {} ".format(rh))
...
Row Header: 1 11
Row Header: 2 22
Row Header: 3 33
>>> grid
[[None, '11', '22', '33'], ['11', 5, None, None], ['22', None, None, None], ['33', None, None, None]]

所以现在你用数据填充它(留作练习,因为这是显而易见的)

我冒昧地将所有整数保留为字符串,因为您显示了将它们连接在一起的趋势

如果您真的想要一个可转置的2D数组,那么最简单(也非常强大)的解决方案就是使用numpy数组。如果您还没有安装numpy,那么您必须安装numpy,但是由于您没有指定扩展库的任何限制,所以我认为这个解决方案是可以接受的

数组索引从0开始,只接受整数。必须有一个带有自定义索引的数组,例如
23、54、34、75
,而不是
0、1、2、3
。如果您决定子类化
numpy.array
并覆盖它的许多方法

相反,我提供了创建一个包装器类的解决方案,该类可以处理自定义索引,但不能进行切片(在您的情况下,这可能是一件毫无意义的事情)。在引擎盖下,当您请求“6523”时,它会将其拆分为两位字符串“65”和“23”,然后在行/列列表中查找它们的位置。在这种情况下,它将是(0,0)。现在,您可以对数组使用此索引来获取所需的元素。查找元素的索引的工作方式与此相反。我们在任何时候都不直接与数组结构交互,因此不需要重写它的任何方法

代码 评论 您不希望用户在输入新元素时重复表索引,例如对(65,23)和(65,54)重复65。您可以简单地要求用户输入一次列和行索引,稍后我们将构建单独的表坐标。对于数据,让用户像读一本书中的行一样一次输入所有数据,即从左到右逐行输入。对于所有输入,用户应使用空格分隔单个成员。例如,在输入列索引时,他应该

23 54 34 75
至于数据呢

AM h 9 C 56 in 13 ok
一旦我们将数据放入一维列表中,我们就可以将它们放入一个数组中,并按照每行指定的列数将其重新调整为二维

该类的结构对功能做出了一些必要的假设,这些假设在您的问题中是隐含的

  • 所有行/列标签均为2位整数(为方便起见,采用字符串格式)
  • 没有两个或多个具有相同名称的表/行/列元素,因为
    list.index()
    numpy.where()
    在这种情况下可能不会像您期望的那样工作。这个假设是有意义的,因为表的使用似乎是为了加密/解密,因此,每个元素应该唯一地映射到另一个元素
  • 在搜索元素序列的索引时,它假定表中没有任何元素是另一个元素的前缀,即“9”和“97”
用法 一旦构建了表,就可以查看数据(不要直接编辑数组!)

访问特定元素

>>> table['7834']
'13'
为元素设置新值

>>> table['7834']  = 'B'
>>> table['7834']
'B'
查找元素所在的位置

>>> table.where('9')   # this should work equally well for '9C'
'6534'
或者永久转置数组

>>> table.transpose()
>>> table.where('9')
'3465'

最后,您可以根据需要向此类添加更多方法,例如,在创建表后添加/删除整行元素。

您正在将
table
的值设置三次,设置为三个不同的值。这就是你想要的吗?不,我想要一张桌子。我只是不知道如何将第一行和第二列与表的其余部分分开,因为数据是不同的。如果我不需要它成为一个真正的表,以后可以进行转置,那么这对我来说将非常有用。这很容易做到吗?@shomz为了更好地满足您的需要,我已经完全改变了我的答案。有一些简单的方法可以使
self.data
self.rows
self.columns
成为外部只读,而在类内部是可写的。但是,这将扩展代码,并且没有必要,除非您希望您的用户多管闲事,可能会损坏他们自己的数据
>>> table['7834']  = 'B'
>>> table['7834']
'B'
>>> table.where('9')   # this should work equally well for '9C'
'6534'
>>> table.transpose()
>>> table.where('9')
'3465'