2013-07-12 48 views
1

我想以一個長字符串的形式追加行的數字,並將其附加到列表內部的列表中。例如,我事先知道每行有4位數字,從01開始只能增加到99,總共有3行。你如何得到這個字符串,將每個數字轉換爲一個int並將它放在正確的列表中以顯示它所在的行?將此字符串格式化爲列表最簡單但不是最快的方法是什麼? Python

myStr = "01 02 03 04 11 12 13 14 21 22 23 24" 
myList = [[01, 02, 03, 04],[11, 12, 13, 14],[21, 22, 23, 24]] 

我需要將數百個這些數據點放入行中,但要理解我在示例中保持較小的概念。我不是在尋找最簡潔和專業的方法來處理這個問題,只是一種簡單的方法會更好。

+1

01可以是一個字符串,但如果它是一個整數,它會自動爲1。 – zhangyangyu

+0

是的,這是正確的,我寫得很清楚。 –

回答

0
myStr = "01 02 03 04 11 12 13 14 21 22 23 24" 
myStr= [int(n) for n in myStr.split()] 
myList=[] 
for i in xrange(0,len(myStr),4): 
    myList.append(myStr[i:i+4]) 

或者,代替for循環,可以再次使用列表理解。

myList=[myStr[i:i+4] for i in xrange(0,len(myStr),4)] 
0

這會將行的所有元素存儲爲字符串,因爲您希望在輸出中使用像01這樣的元素。既然你只是想簡單/容易閱讀,這可能是好的。

nums = myStr.split(' ') 

myList[] 
li=[] 

int i = 0; 
for n in nums: 
    if i == 4: 
     i = 0 
     myList.append(list) 
     li= [] 
    li.append(n) 
    i += 1 
1

這是我會做什麼?

numDigits = 4 #Number of digits per row 
a = [int(val) for val in myStr.split()] 
myList = [] 
for i in arange(0, len(a), numDigits): 
    myList.append(a[i:i+numDigits]) 

希望這有助於!

0

使用zip

>>> myStr = "01 02 03 04 11 12 13 14 21 22 23 24" 
>>> n=4 
>>> myList=[list(t) for t in zip(*[(int(x) for x in myStr.split())]*n)] 
>>> myList 
[[1, 2, 3, 4], [11, 12, 13, 14], [21, 22, 23, 24]] 

>>> myList=map(list,zip(*[(int(x) for x in myStr.split())]*n)) 

如果你不介意的內部元素的元組VS列表,你可以這樣做:

>>> zip(*[(int(x) for x in myStr.split())]*n) 
[(1, 2, 3, 4), (11, 12, 13, 14), (21, 22, 23, 24)] 

郵編會截斷任何不完整的組。如果有可能,你的行是不均勻的,用切片:

>>> myList=map(int,myStr.split()) 
>>> n=5 
>>> [myList[i:i+n] for i in range(0,len(myList),n)] # use xrange on Py 2k... 
[[1, 2, 3, 4, 11], [12, 13, 14, 21, 22], [23, 24]] 

如果你想要一個intertools配方,使用石斑魚食譜:

>>> from itertools import izip_longest 
def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 

>>> map(list,grouper(map(int,myStr.split()),4)) 
[[1, 2, 3, 4], [11, 12, 13, 14], [21, 22, 23, 24]] 
0

好的答案了。這裏有一個系統的方法,如果你不舒服的列表理解還有range:

# get or build your string 
myStr = "01 02 03 04 11 12 13 14 21 22 23 24" 

#set a group size 
GROUP_SZ = 4 

item_list=myStr.split(' ') 
groups= len(item_list) 
chunks=[] 

for j in range(groups/GROUP_SZ): 
    slice=item_list[:GROUP_SZ] 
    del item_list[:GROUP_SZ] 
    chunks.append(slice) 

# account for left over bits, if myStr is not a multiple of GROUP_SZ 
if len(item_list) > 0: 
    chunks.append(item_list) 

然後塊包含你想要什麼,並在位任何離開,如果你的原始字符串是不是你組大小的整數倍。

+0

你爲什麼要刪除那個元素,爲什麼它會奇蹟般地把這個變成:'[['01','02','03','04'],['01','02','03','04 '',''01','02','03','04'],['01','02','03','04','11','12','13', '','14','21','22','23','24']]分成[['01','02','03','04'],['11','12',' '13','14'],['21','22','23','24']]? –

0

我可能會這樣做。

def gridify(s, cols): 
    ls = map(int, s.split()) 
    return map(list, zip(*[iter(ls)]*cols)) 

如果你可以使用元組列表,你可以不使用最後一張地圖。在我學習使用zip的習慣用法之前,我可能會使用切片,另一個用於從序列中分組元素的習慣用法。

def gridify(s, cols): 
    flatList = map(int, s.split()) 
    return [flatList[x:x+cols] for x in range(0, len(flatList), cols)] 

如果你正在尋找「讀取容易的方法」,我想這應該做的。

def gridify(s, rows, cols): 
    flatList = s.split() 
    gridList = [] 
    for r in range(rows): 
     rowList = [] 
     for c in range(cols): 
      ind = (r * rows) + c 
      val = flatList[ind] 
      rowList.append(int(val)) 
     gridList.append(rowList) 
    return gridList 
0
import re 

myStr = "01 02 03 04 11 12 13 14 21 22 23 24" 

n = 4 
print [map(int,x) 
     for x in re.findall(n *('(\d\d?) *'),myStr)] 

另外,在同樣的想法

n = 4 

def fff(x): 
    return map(int,x) 

print map(fff, re.findall(n *('(\d\d?) *'),myStr)) 
相關問題