【问题标题】:What is the easiest but not fastest way to format this string into a list? Python [duplicate]将此字符串格式化为列表的最简单但不是最快的方法是什么? Python [重复]
【发布时间】:2013-07-11 04:00:44
【问题描述】:

我想以一个长字符串的形式附加数字行,以根据它们的行附加到列表内的列表中。比如我提前知道每行有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]]

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

【问题讨论】:

  • 01可以是字符串,如果是整数则自动为1。
  • 是的,没错,我写的很清楚。

标签: python string list int append


【解决方案1】:
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))

【讨论】:

    【解决方案2】:

    我可能会这样做。

    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        已经有了很好的答案。如果您对列表推导和 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)
        

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

        【讨论】:

        • 你为什么要删除那个元素,为什么它会神奇地变成这个:[['01', '02', '03', '04'], ['01', '02', '03', '04'], ['01', '02', '03', '04'], ['01', '02', '03', '04', '11', '12', '13', '14', '21', '22', '23', '24']] into [['01', '02', '03', '04'], ['11', '12', '13', '14'], ['21', '22', '23', '24']]
        【解决方案5】:

        这会将行的所有元素存储为字符串,因为您希望在输出中包含像 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
        

        【讨论】:

          【解决方案6】:

          这就是我会做的……

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

          希望这会有所帮助!

          【讨论】:

            【解决方案7】:
            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)]
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-03-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-07
              • 2012-08-01
              • 2017-02-14
              • 2014-12-14
              相关资源
              最近更新 更多