问题:
互锁
创建一个带两个相同字符串的函数 长度或与参数长度相同的一个字符。它 然后应该采取这两个字符串并将它们互锁,取一个 每个字符串中的字符,将它们互锁。如果字符串是 不同的长度,那么结果总是应该从更长的时间开始 字符串。
我的编码(对不起,我是初学者,并不是非常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!
感谢
感谢所有建议成为更好程序员的方法的人!我一天都没有太多的时间去编程,所以当很多人花时间来提出建议时,这是非常好的。我喜欢这个网站,它是社区:)
答案 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='')))