在Python中连接两个字符串ProblemSetQuestion(自学)

时间:2012-11-19 20:05:32

标签: python python-3.x

Winkleson在这里!当我遇到问题时,我正在学习Python。我已经到了我头晕目眩的地步:P无论如何,任何帮助都会非常感激!提前谢谢!

问题:


  

互锁

     

创建一个带两个相同字符串的函数   长度或与参数长度相同的一个字符。它   然后应该采取这两个字符串并将它们互锁,取一个   每个字符串中的字符,将它们互锁。如果字符串是   不同的长度,那么结果总是应该从更长的时间开始   字符串。

我的编码(对不起,我是初学者,并不是非常Pythonic:P):


def interlock(s1, s2):

    r = 0
    l1 = []
    l2 = []
    inters = ''

    for i in range(len(s1)):

            l1.append(i)

    for i in range(len(s2)):

            l2.append(i)

    if len(s2) == len(s1):        

        for i in range(len(s1)):
            inters += ''.join(s1[i])
            inters += ''.join(s2[i])                

    elif len(s1) < len(s2):

        for i in range(len(s1)):
            inters += ''.join(s2[i])
            inters += ''.join(s1[i])
            r = i

        inters += ''.join(s2[r])

    elif len(s2) < len(s1):

        for i in range(len(s2)):
            inters += ''.join(s1[i])
            inters += ''.join(s2[i])
            r = i

        inters += ''.join(s1[r])

    else:
        pass

    return inters

结果(我收到的结果):

___________________________________________________________________________________________

 Call                   Expected    Received    Correct

 interlock('shoe','cold')   schooled    schooled    true

 interlock('flat','etry')   feltarty    feltarty    true

 **interlock('ab','siy')    saiby           saibi           false**

 **interlock('abalone','hammer')    ahbaamlmoenre   ahbaamlmoenrn   false**

 interlock('','a')          a           a           true

___________________________________________________________________________________________

两个更大胆的领域是我遇到最多问题的地方。如果我尝试添加最后一个字符,我会得到一个神秘的超出范围的异常。任何想法/解决方案将不胜感激! - 温克尔森

Ps这比我的正常帖子要短......通常我会对我认为自己做错了什么提出一个(非)准确的想法,它会一直拖着......你明白了。无论如何,我可能像一个白痴一样打破了我的循环。所以... Goodluck!

感谢

感谢所有建议成为更好程序员的方法的人!我一天都没有太多的时间去编程,所以当很多人花时间来提出建议时,这是非常好的。我喜欢这个网站,它是社区:)

4 个答案:

答案 0 :(得分:2)

也许这可以缩短,但我认为这是相当pythonic而不是太多pythonic,除了它不使用太多的黑魔法,没有进口:

def interlock(s1, s2):
    if len(s1) < len(s2):
        s1, s2 = s2, s1

    s1, s2 = map(list, [s1, s2])
    for i in xrange(len(s2)):
        s1.insert((2*i+1), s2[i])
    print ''.join(s1)

现在有些Python教学:

  • s1, s2 = s2, s1是一种交换两个变量的非常pythonic方式。我用它来确保s1是最长的字符串;
  • map用于将函数list()映射到字符串列表[s1, s2],将它们转换为单个字符串列表;
  • insert是一个列表方法(字符串没有它)用于在一个给定位置的序列中间插入一个项目;
  • (2*i + 1)部分是必要的,因为必须在s1的所有其他项之间插入;
  • ''.join()是一个字符串操作,用于将生成的字符列表连接成一个字符串,使用空字符串或“nothing”('')作为分隔符或“join elements” ”

希望这有帮助!

答案 1 :(得分:2)

当其他人向您展示如何使用itertools(这是一个非常有用的练习)时,这将有希望演示如何编写您的函数来帮助您学习一些基本的编程:

def interlock(s1, s2):

    r = 1
    l1 = list(s1)
    l2 = list(s2)
    inters = ''
    if len(s2) == len(s1):        
        for i in range(len(s1)):
            inters += s1[i]
            inters += s2[i]

    elif len(s1) < len(s2):
        for i in range(len(s1)):
            inters += s2[i]
            inters += s1[i]
            r = i+1
        inters += s2[r]

    elif len(s2) < len(s1):
        for i in range(len(s2)):
            inters += s1[i]
            inters += s2[i]
            r = i+1

        inters += s1[r]

    else:
        pass

    return inters


a = interlock('abalone','hammer')
print (a)
print (a[::2])
print (a[1::2])
a = interlock('hammer','abalone')
print (a)
print (a[::2])
print (a[1::2])
a = interlock('ab','siy')
print (a)

我故意保留原始代码中的大部分结构,只删除完全没有必要的部分(例如,过度使用str.join)。

答案 2 :(得分:1)

您需要参与一些数据驱动的编程:

s1,s2 = sorted(("foo","baxer"), key=len, reverse=True)

现在,您现在的输入具有固定的关系。

Python在itertools模块中还有许多工具可以帮助您更轻松地实现这一目标。

以上是mgilson代码的简化版本:

def interlock(in1, in2):
    r = 1
    s1,s2 = sorted((in1,in2), key=len, reverse=True)
    inters = ''
    for i in range(len(s1)):
        inters += s2[i]
        inters += s1[i]
        r = i+1
    if r < len(s2):
        inters += s2[r]

    return inters

您可以看到,简单地使您的数据与特定的不变量相对应,无需使用三分之二的代码。

答案 3 :(得分:1)

尝试使用itertools

def interlock(s1, s2):
    if len(s2) > len(s1):
        (s1, s2) = (s2, s1)

    return ''.join(itertools.chain(*itertools.izip_longest(s1, s2, fillvalue='')))