2016-04-14 29 views
1

Kullanıcı dizgisini güncellemek istediğim dinamik bir dizim var, örneğin, 'mannysattynastysillyfully' gibi 25 karakterlik tek bir dize için . 5x5 dizisi olurdu.Python'da dinamik bir dizi oluşturma

m a n n y 
s a t t y 
n a s t y 
s i l l y 
f u l l y 

Birden şey denedik ve ben nasıl olması gerektiğini 1. How to define two-dimensional array in python 2. How to take input in an array + PYTHON? hala yapamaz 3. python - how to split an input string into an array?

Am kavramaya ben aldığım bilgilerin biraz geniş arama geçti var kullanıcı değerleri dinamik diziye girmesini uğraşan

+3

"dinamik dizi" ile tam olarak ne demek istiyorsunuz? – Thomas

+0

@Thomas, dizi dizesini kullanıcı dizesine göre kendiliğinden kastediyor Örneğin, örneğin, dizge 25chr uzunsa, dizi 5x5 –

+0

olarak boyutlandırılır. Python'da gerçekten çok boyutlu bir dizi yoktur. Bunu pandalar ve tablib de dahil olmak üzere yapabileceğiniz birkaç kütüphane var. Sadece bir liste listesi veya bunun gibi bir şey kullanabilirsiniz. –

cevap

2

Bu senin ne yapabilir düşünüyorum sonra:

>>> def two_dim(inval, width=5): 
...  out = [] 
...  for i in range(0, len(inval) - 1, width): 
...   out.append(list(inval[i:i + width])) 
...  return out 
... 
>>> print(two_dim('mannysattynastysillyfully')) 
[['m', 'a', 'n', 'n', 'y'], ['s', 'a', 't', 't', 'y'], ['n', 'a', 's', 't', 'y'], ['s', 'i', 'l', 'l', 'y'], ['f', 'u', 'l', 'l', 'y']] 

Ve söz konusu olması gibi yazdırmak için: bu yüzden sonuçlanacaktır girdi dizesinin uzunluğunun bir faktör değildir genişliği kullanılarak,

>>> c = two_dim('mannysattynastysillyfully') 
>>> for sub in c: 
...  print " ".join(sub) 
... 
m a n n y 
s a t t y 
n a s t y 
s i l l y 
f u l l y 

NOT Bu, ancak tam satırları yaratacak kayıp verilerde. Bu istenirse değiştirmek kolaydır, ancak bunu okuyucuya bir egzersiz olarak bırakacağım.

o zaman

def is_square(l): 
    return math.floor(math.sqrt(l))**2 == l 

def two_dim_square(inval): 
    if not is_square(len(inval)): 
     raise Exception("string length is not a perfect square") 
    width = math.sqrt(len(inval)) 
    # proceed like before with a derived width 

EDIT'e 2

def two_dim(inval, width=5): 
    out = [] 
    for i in range(0, len(inval) - 1, width): 
     out.append(list(inval[i:i + width])) 
    return out 

def print_array(label, inval, joiner=' '): 
    print label 
    for sub in inval: 
     print joiner.join(sub) 
    print 

print_array("3 by X", two_dim('mannysattynastysillyfully', 3)) 
print_array("4 by X", two_dim('mannysattynastysillyfully', 4)) 
print_array("5 by X", two_dim('mannysattynastysillyfully', 5)) 
print_array("6 by X", two_dim('mannysattynastysillyfully', 6)) 

gibi bir şey yapabileceğini, her zaman bir kare 2x2 oluşturmak isteyen varsa çıktılı

3 by X 
m a n 
n y s 
a t t 
y n a 
s t y 
s i l 
l y f 
u l l 

4 by X 
m a n n 
y s a t 
t y n a 
s t y s 
i l l y 
f u l l 

5 by X 
m a n n y 
s a t t y 
n a s t y 
s i l l y 
f u l l y 

6 by X 
m a n n y s 
a t t y n a 
s t y s i l 
l y f u l l 

verir EDIT 3 012 Tüm veriler her zaman mevcut olması ve boş hücreler için varsayılan bir değer kullanmak istiyorsanız, o

print_array("3 by X", two_dim('mannysattynastysillyfully', 3, '*')) 

ÇIKIŞ ile Denilen

def two_dim(inval, width=5, fill=' '): 
    out = [] 
    # This just right-pads the input string with the correct number of fill values so the N*M is complete. 
    inval = inval + (fill * (width - (len(inval) % width))) 
    for i in range(0, len(inval) - 1, width): 
     out.append(list(inval[i:i + width])) 
    return out 

gibi görünecektir

3 by X 
m a n 
n y s 
a t t 
y n a 
s t y 
s i l 
l y f 
u l l 
y * * 
+0

mükemmel yanıt olarak tutulur, sadece ne olabileceğinden Eğer genişlik –

+0

anında kararlaştırılacaksa ne yapılır? Ne demek istiyorsun - "eğer genişlik uçta karar vermek gerekirse"? – sberry

+0

Yani dizinin genişliği kullanıcı tarafından karar verilecek ise –