2013-07-12 45 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)) 
相关问题