如何使用 Python 定义二维数组划分的部分编号?
How to define section number that 2d-array is divided to using Python?
我有这个数据结构:
它是二维数组,分为3个部分。对于数组中的每个字母,我需要定义 Section 编号。例如,字母 a,b,c,d
在 第 1 节 中; e,f,g,h
在 第 2 部分。
我的代码。首先,这个二维数组准备:
from itertools import cycle
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
#2d-array initialization
width, height = 3, 6
repRange = cycle(range(1, 3))
values = [0] * (width - 1)
array2d = [[next(repRange)] + values for y in range(height)]
#Filling array with letters:
m = 0
for i in range(height):
for j in range(1,width):
array2d[i][j] = letters[m]
m+=1
#Printing:
for row in array2d:
print(row)
输出:
[1, 'a', 'b']
[2, 'c', 'd']
[1, 'e', 'f']
[2, 'g', 'h']
[1, 'i', 'j']
[2, 'k', 'l']
现在我需要确定每个字母的节号并将其与字母本身一起保存。我使用 defineSection
函数并将值保存在字典中:
def defineSection(i, division, height):
if i <= division:
return 1
elif division*2 >= i > division :
return 2
elif division*3 >= i > division*2 :
return 3
dic = {}
for i in range(height):
for j in range(1,width):
section = defineSection(i+1, 2, height)
dic.update({array2d[i][j] : section})
for item in dic.items():
print(item)
输出:
('f', 2)
('b', 1)
('c', 1)
('e', 2)
('k', 3)
('g', 2)
('d', 1)
('a', 1)
('l', 3)
('h', 2)
('i', 3)
('j', 3)
它正确定义了每个字母的所有节号。但是 defineSection
方法是原始的,如果行数大于 6 将不起作用。
我不知道如何实现 defineSection
方法,以便它仅考虑当前 行号 、 分区 自动定义节号和 总行数 。
问题:有没有什么方法可以简单地确定节号而不需要这么多 if-elif
条件并且独立于总行数?
您可以极大地简化矩阵创建代码。您只需要一个 letters
迭代器,它本身 returns 这样您就可以使用 zip 一次迭代 2 个字母。
In [3]: from itertools import cycle
In [4]: letters = "abcdefghijkl"
In [5]: ranges = cycle(range(1,3))
In [6]: iter_letters = iter(letters)
In [7]: matrix = [[i,a,b] for i,a,b in zip(ranges,iter_letters,iter_letters)]
In [8]: matrix
Out[8]:
[[1, 'a', 'b'],
[2, 'c', 'd'],
[1, 'e', 'f'],
[2, 'g', 'h'],
[1, 'i', 'j'],
[2, 'k', 'l']]
关于分节,注意每两行一个节,也就是四个个字母,所以可以用简单的楼层划分来"skip"个数。
In [9]: sections = {letter:(i//4 + 1) for i,letter in enumerate(letters)}
In [10]: sections
Out[10]:
{'a': 1,
'b': 1,
'c': 1,
'd': 1,
'e': 2,
'f': 2,
'g': 2,
'h': 2,
'i': 3,
'j': 3,
'k': 3,
'l': 3}
我有这个数据结构:
它是二维数组,分为3个部分。对于数组中的每个字母,我需要定义 Section 编号。例如,字母 a,b,c,d
在 第 1 节 中; e,f,g,h
在 第 2 部分。
我的代码。首先,这个二维数组准备:
from itertools import cycle
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
#2d-array initialization
width, height = 3, 6
repRange = cycle(range(1, 3))
values = [0] * (width - 1)
array2d = [[next(repRange)] + values for y in range(height)]
#Filling array with letters:
m = 0
for i in range(height):
for j in range(1,width):
array2d[i][j] = letters[m]
m+=1
#Printing:
for row in array2d:
print(row)
输出:
[1, 'a', 'b']
[2, 'c', 'd']
[1, 'e', 'f']
[2, 'g', 'h']
[1, 'i', 'j']
[2, 'k', 'l']
现在我需要确定每个字母的节号并将其与字母本身一起保存。我使用 defineSection
函数并将值保存在字典中:
def defineSection(i, division, height):
if i <= division:
return 1
elif division*2 >= i > division :
return 2
elif division*3 >= i > division*2 :
return 3
dic = {}
for i in range(height):
for j in range(1,width):
section = defineSection(i+1, 2, height)
dic.update({array2d[i][j] : section})
for item in dic.items():
print(item)
输出:
('f', 2)
('b', 1)
('c', 1)
('e', 2)
('k', 3)
('g', 2)
('d', 1)
('a', 1)
('l', 3)
('h', 2)
('i', 3)
('j', 3)
它正确定义了每个字母的所有节号。但是 defineSection
方法是原始的,如果行数大于 6 将不起作用。
我不知道如何实现 defineSection
方法,以便它仅考虑当前 行号 、 分区 自动定义节号和 总行数 。
问题:有没有什么方法可以简单地确定节号而不需要这么多 if-elif
条件并且独立于总行数?
您可以极大地简化矩阵创建代码。您只需要一个 letters
迭代器,它本身 returns 这样您就可以使用 zip 一次迭代 2 个字母。
In [3]: from itertools import cycle
In [4]: letters = "abcdefghijkl"
In [5]: ranges = cycle(range(1,3))
In [6]: iter_letters = iter(letters)
In [7]: matrix = [[i,a,b] for i,a,b in zip(ranges,iter_letters,iter_letters)]
In [8]: matrix
Out[8]:
[[1, 'a', 'b'],
[2, 'c', 'd'],
[1, 'e', 'f'],
[2, 'g', 'h'],
[1, 'i', 'j'],
[2, 'k', 'l']]
关于分节,注意每两行一个节,也就是四个个字母,所以可以用简单的楼层划分来"skip"个数。
In [9]: sections = {letter:(i//4 + 1) for i,letter in enumerate(letters)}
In [10]: sections
Out[10]:
{'a': 1,
'b': 1,
'c': 1,
'd': 1,
'e': 2,
'f': 2,
'g': 2,
'h': 2,
'i': 3,
'j': 3,
'k': 3,
'l': 3}