0

温克尔森来了!当我遇到问题时,我目前正在学习 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 这比我的正常帖子要短......通常我会给出一个(不)准确的想法,说明我认为我做错了什么,它会一直拖下去......你明白了主意。无论如何,我可能像个白痴一样打破了循环。所以...祝你好运!

谢谢

感谢所有建议如何成为更好的程序员的人!我一天没有太多时间来编程,所以当有这么多人抽出时间来提出建议时,这真是太好了。我喜欢这个网站和它的社区:)

4

4 回答 4

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”('')作为分隔符或“连接元素”。

希望这可以帮助!

于 2012-11-19T20:21:06.813 回答
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)。

于 2012-11-19T20:21:37.450 回答
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

您可以看到,只需使您的数据对应于特定的不变量,就不需要三分之二的代码。

于 2012-11-19T20:14:10.037 回答
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='')))
于 2012-11-19T20:17:14.293 回答