2016-10-25 1 views
1

私はこのデータ構造を有する:2次元配列がPythonを使って分割されているセクション番号を定義するには?

enter image description here

それはセクションに分割された2Dアレイです。配列の各文字については、セクションの番号を定義する必要があります。たとえば、文字a,b,c,dセクション1にあります。 e,f,g,hセクション2にあります。


マイコード。まず、この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'] 

は今、私は、各文字のセクション番号を決定し、文字自体とともに、それを保存する必要があります。それは、正しく各文字のすべてのセクション番号を定義し

('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機能を使用し、辞書に値を保存します。

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) 

出力。しかしdefineSection方法は原始的で、行数が6 より大きい場合は動作しません私は、それが自動的にアカウントにのみ、現在の行番号を取っセクション番号を定義するようにdefineSectionメソッドを実装する方法を部門を知らないと行数合計。


質問:私は単純にそう多くif-elif条件なしで独立した行の合計数のセクション番号を決定することができますいくつかの方法がありますか?

答えて

2

行列作成コードを大幅に簡略化することができます。必要なのはlettersイテレータで、それ自体を返しますので、一度に2文字をzipで繰り返し処理できます。セクションを割り当てるよう

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']] 

、あなたがカウントを「スキップ」するために、単純なフロア部門を使用することができますので、文字である、セクションでは、すべての二列であることに注意してください。

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} 
関連する問題