【问题标题】:How to make a continuous alphabetic list python (from a-z then from aa, ab, ac etc)如何制作一个连续的字母列表python(从a-z然后从aa,ab,ac等)
【发布时间】:2015-06-03 18:43:37
【问题描述】:

我想为类似于 Excel 工作表的应用程序制作一个按字母顺序排列的列表。

用户会输入单元格的数量,我想生成列表。 例如,用户需要 54 个单元格。然后我会生成

'a','b','c',...,'z','aa','ab','ac',...,'az','ba','bb'

我可以从[ref]生成列表

 from string import ascii_lowercase
 L = list(ascii_lowercase) 

我如何将它缝合在一起? 一个类似的 PHP 问题已经被问到here。有人有python等价物吗?

【问题讨论】:

    标签: python enumerate alphabetical


    【解决方案1】:

    使用itertools.product

    from string import ascii_lowercase
    import itertools
    
    def iter_all_strings():
        for size in itertools.count(1):
            for s in itertools.product(ascii_lowercase, repeat=size):
                yield "".join(s)
    
    for s in iter_all_strings():
        print(s)
        if s == 'bb':
            break
    

    结果:

    a
    b
    c
    d
    e
    ...
    y
    z
    aa
    ab
    ac
    ...
    ay
    az
    ba
    bb
    

    这具有超越两个字母组合的额外好处。如果您需要一百万个字符串,它会很乐意为您提供三个、四个和五个字母的字符串。


    额外的风格提示:如果您不喜欢在底部循环中使用显式 break,您可以使用 islice 使循环自行终止:

    for s in itertools.islice(iter_all_strings(), 54):
        print s
    

    【讨论】:

    • 无论如何我可以说从 hhhh 开始
    • 这太棒了。干得好,先生。
    【解决方案2】:

    您可以使用列表推导。

    from string import ascii_lowercase
    L = list(ascii_lowercase) + [letter1+letter2 for letter1 in ascii_lowercase for letter2 in ascii_lowercase]
    

    【讨论】:

    • 这似乎没有得到单字母组合“a”、“b”等
    • 好的,但是如果用户需要超过 702 个不同的字符串怎么办?他们需要超越“zz”进入“aaa”。
    • 很公平......我从你的问题中不明白
    【解决方案3】:

    按照@Kevin 的回答:

    from string import ascii_lowercase
    import itertools
    
    # define the generator itself
    def iter_all_strings():
        size = 1
        while True:
            for s in itertools.product(ascii_lowercase, repeat=size):
                yield "".join(s)
            size +=1
    

    下面的代码可以生成字符串,例如可以用来生成唯一标签。

    # define the generator handler
    gen = iter_all_strings()
    def label_gen():
        for s in gen:
            return s
    
    # call it whenever needed
    print label_gen()
    print label_gen()
    print label_gen()
    

    【讨论】:

      【解决方案4】:

      我最终自己做了。 我认为它可以创建任意数量的字母。

      def AA(n, s):
          r = n % 26
          r = r if r > 0 else 26
          n = (n - r) / 26
          s = chr(64 + r) + s
      
          if n > 26: 
              s = AA(n, s)
          elif n > 0:
              s = chr(64 + n) + s
      
          return s
      

      n = quantity | r = remaining (26 letters A-Z) | s = string

      打印列表:

      def uprint(nc):
          for x in range(1, nc + 1):
              print AA(x,'').lower()
      

      在转换为 python 之前使用 VBA:

      Function AA(n, s)
      
          r = n Mod 26
          r = IIf(r > 0, r, 26)
          n = (n - r) / 26
          s = Chr(64 + r) & s
      
          If n > 26 Then
              s = AA(n, s)
          ElseIf n > 0 Then
              s = Chr(64 + n) & s
          End If
      
          AA = s
      
      End Function
      

      【讨论】:

      • 这很好用。需要注意的是,AA 函数n = (n - r) / 26 中的行在Python 3.x 中应该使用地板除法(如n = (n - r) // 26
      【解决方案5】:

      在 while 循环中使用 neo 的洞察力。 对于以升序排列的字符的给定迭代。 'A B C D...'。 n 是表示的第 N 个位置,从 1 开始作为第一个位置。

      def char_label(n, chars):
          indexes = []
          while n:
              residual = n % len(chars)
              if residual == 0:
                  residual = len(chars)
              indexes.append(residual)
              n = (n - residual)
              n = n // len(chars)
          indexes.reverse()
          label = ''
          for i in indexes:
              label += chars[i-1]
          return label
      

      稍后您可以使用 for 循环打印所需的“标签”范围 n 的列表:

      my_chrs = 'abc'
      n = 15
      for i in range(1, n+1):
          print(char_label(i, my_chrs))
      

      或建立一个列表理解等......

      【讨论】:

        【解决方案6】:

        打印小写和大写承租人的xl单元格范围集

        大写:

        from string import ascii_uppercase
        import itertools
        def iter_range_strings(start_colu):
            for size in itertools.count(1):
                for string  in itertools.product(ascii_uppercase, repeat=size):
                    yield "".join(string)
        
        input_colume_range = ['A', 'B']
        input_row_range= [1,2]
        for row in iter_range_strings(input_colume_range[0]):
            for colum in range(int(input_row_range[0]), int(input_row_range[1]+1)):
                print(str(row)+ str(colum))
            if row ==  input_colume_range[1]:
                break
        
        

        结果:

        A1
        A2
        B1
        B2
        

        【讨论】:

          【解决方案7】:

          两行(加上一个导入):

          from string import ascii_uppercase as ABC
          
          count = 100
          ABC+=' '
          [(ABC[x[0]] + ABC[x[1]]).strip() for i in range(count) if (x:= divmod(i-26, 26))]
          

          如果需要重用,请将其包装在函数/lambda 中。

          【讨论】:

            【解决方案8】:

            代码:

            alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
            for i in range(len(alphabet)):
                for a in range(len(alphabet)):
                    print(alphabet[i] + alphabet[a])
            

            结果:

            aa
            ab
            ac
            ad
            ae
            af
            ag
            ah
            ai
            aj
            ak
            al
            am
            ...
            

            【讨论】:

            • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
            猜你喜欢
            • 1970-01-01
            • 2021-11-15
            • 1970-01-01
            • 2011-07-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多