1

我想以一个长字符串的形式附加数字行,以根据它们的行附加到列表内的列表中。比如我提前知道每行有4位只能从01到99,一共3行。您将如何通过字符串,将每个数字转换为 int 并将其放入正确的列表中以显示它在哪一行?

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

我需要将数百个这些数据点放入行中,但要理解我在示例中保持较小的概念。我不是在寻找最简洁和最专业的方法来处理问题,只是一种易于阅读的方法会更好。

4

7 回答 7

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

希望这可以帮助!

于 2013-07-12T15:01:00.447 回答
0

已经有了很好的答案。如果您对列表推导和 xrange 不满意,这是一种有条不紊的方法:

# 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)

然后,如果您的原始字符串不是组大小的整数倍,则块包含您想要的内容以及任何剩余的位。

于 2013-07-12T15:25:01.987 回答
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
于 2013-07-12T16:25:30.150 回答
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))

如果你不介意内部元素是元组还是列表,你可以这样做:

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

Zip 将截断任何不完整的组。如果您的行可能不均匀,请使用切片:

>>> 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]]
于 2013-07-12T15:01:43.980 回答
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))
于 2013-07-12T16:49:52.373 回答
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
于 2013-07-12T14:56:39.567 回答
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)]
于 2013-07-12T14:58:56.920 回答