2016-12-24 61 views
1

好吧...我需要遍历任意长度的字符串。因为我不知道该如何解释这也很好,我的意思是这样的:通过数字的未知长度的字母进行迭代

def zip(string1,string1): 
    ... 

当与"a""ad"称它会返回一个列表:

>>>zip("a","ad") 
["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","aa","ab","ac","ad"] 

我已经尝试使用map(chr,range(ord('a'),ord('nb')+1))但我得到TypeError: ord() expected a character, but string of length 2 found,我不知道该从哪里出发。有任何想法吗?

+0

起初我有点困惑,因为zip是一种实际的python方法。 – Fallenreaper

回答

4

就是这样:

def zip_(start, end): 
    def __inc(s): 
     if not s: 
      return "a" 
     elif s[-1] != "z": 
      return s[:-1] + chr(ord(s[-1]) + 1) 
     else: 
      return __inc(s[:-1]) + "a" 

    s = start 

    yield s 
    while s != end: 
     s = __inc(s) 
     yield s 


print list(zip_("a", "ad")) 

几点意见:

  1. 不要用这个词zip作为一个变量或函数的名称,因为它已被保留。
  2. 在解决方案zip_是一个生成器。我这样做是为了不将太多的数据保存在内存中。如果您需要一个确切的列表,只需按照我在print-statement中所做的那样转换它即可。
  3. 如果参数错误,该函数可能进入无限循环。例如,如果您致电zip_("b", "a")。但实际上,如果需要添加几行,很容易修复。
+0

谢谢!这工作完美,我喜欢它也是一个发电机! – TheCompModder

1

这是一个基数为26的数字系统,这里是我将如何解决它。另外zip是一个python内建函数,可能最好不要重新定义它。

def alphaToNumber(s): 
    r = 0 
    for x in s: 
     r *= 26 
     r += ord(x) - 96 
    return r 

def numberToAlpha(n, result): 
    head = (n - 1) // 26 
    tail = chr((n - 1) % 26 + 97) 
    if head == 0: 
     return tail + result 
    else: 
     return numberToAlpha(head, tail + result) 

def gen(start, end): 
    start_n = alphaToNumber(start) 
    end_n = alphaToNumber(end) 
    return [numberToAlpha(x, "") for x in range(start_n, end_n + 1)] 

print(gen("a", "ad")) 

# ['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', 'aa', 'ab', 'ac', 'ad']