我似乎无法弄清楚这一点。请帮忙!
(Python)给定字符串s1和s2,不一定长度相同,创建一个由s1和s2的交替字符组成的新字符串(即s1的第一个字符后跟s2的第一个字符,后面跟着通过s1的第二个字符,然后是s2的第二个字符,依此类推。一旦到达任一字符串的末尾,就不会添加其他字符。例如,如果s1包含" abc"和s2包含" uvwxyz"然后新字符串应包含" aubvcw"。将新字符串分配给变量s3。
答案 0 :(得分:0)
s3 = ''.join(s1[i]+s2[i] for i in range(0, min(len(s1), len(s2))))
这样你就可以用char混合两个字符串char。循环是这个字符串的最小长度。那么,如果s1> s2,范围将从0到len(s2)并且如果s1 结果如下: 但这很难看。第一个代码是python样式,而在python中,样式非常重要。我们不想写丑陋的代码:)s3 = ''
for i in range(0, min(len(s1), len(s2))):
s3 = s3 + s1[i] + s2[i]
答案 1 :(得分:0)
只有代码,但评论很多......
# your strings
s1 = "abcdefg"
s2 = "zyxwvutsr"
# your new string, start with an empty one
s3 = ""
# the lenght of the input strings (yes, it's legal)
l1, l2 = len(s1), len(s2)
# find the shortest (MINimum) length
l0 = min(l1,l2)
# build s3 step by step, do you know about for loops, do you?
for i in range(l0):
s3 = s3 + s1[i] + s2[i]
print 'step %02d: s3 = "%s"' % (i, s3)
# and we can show the result of our zipping together the two strings
print '\nThe final value of s3 is "%s".' % (s3,)
####################################################################
# EXTRA PART - NOT REQUESTED
####################################################################
# Say we want to append to s3 the part of the longest string that
# was not appended, the "tail" of the longest string
if l1 >l2: tail = s1[l0:]
if l2 >l1: tail = s2[l0:]
# what is the meaning of, e.g., s2[l0:]? --- we denote a "slice",
# a part, of the string using two indices and a ":" colon, here the
# omitted second index means "up to the end of the string, refer to
# https://docs.python.org/3.4/tutorial/introduction.html#strings
# for details
# That said, we have to consider another possibility, that
# the lengths are the same
if l1==l2: tail = ""
# we add the tail to s3 and output our result
s3 = s3+tail
print '\nThe final final value of s3 is "%s".' % (s3,)
为了清楚起见,我没有使用经验丰富的python程序员会使用的习语,而是使用最简单的表达式,但是我必须提到在循环中构建一个字符串是python执行速度很慢的一件事。您可以参考任何其他答案,了解如何构建子字符串列表,并最终在您使用我向您展示的方法的一小部分时间内加入所需结果中的子字符串。
答案 2 :(得分:0)
正如斯图尔特所说,zip()
功能非常适用于此。
虽然我们可以使用索引来获取字符输入字符串,但在Simeon Popov的答案中,在实际应用中,它被认为是更多Pythonic以避免使用索引。我们可以这样做,因为Python中的序列对象(例如列表,元组和字符串)是可迭代的,这意味着我们可以做类似的事情
for c in my_string:
print(c)
它将打印my_string
中的每个字符,每行一个字符。
对于你的问题,我们需要并行迭代一对对象,zip()
函数使这很容易。它创建了传递给它的迭代元素的元组列表。第一个元组包含每个可迭代的第一个元素,第二个元组包含每个可迭代的第二个元素等;当最短的iterable耗尽时,列表终止。
所以
zip("abc", "uvwxyz")
返回
[('a', 'u'), ('b', 'v'), ('c', 'w')]
现在我们只需要正确加入所有部分。 :)
这样做的一种方法是:
s1 = "abc"
s2 = "uvwxyz"
temp = []
for c1, c2 in zip(s1, s2):
temp.append(c1 + c2)
s3 = ''.join(temp)
print(s3)
<强>输出强>
aubvcw
循环将字符对连接成字符串并将它们存储在temp
列表中。然后,我们使用字符串.join()
方法将该列表的内容加入到单个字符串中。
但是我们可以使用列表理解更紧凑地做到这一点:
s1 = "abc"
s2 = "uvwxyz"
s3 = ''.join([c1 + c2 for c1, c2 in zip(s1, s2)])
print(s3)
答案 3 :(得分:0)
几乎在那里: zip操作符可以满足您的需求,就像zip一样,它将逐个匹配条目,直到其中一个向量/字符串结束。然后只需一个列表理解和一个str.join应该可以做到这一点!
s1 = 'bla'
s2 = 'blabla'
s3 = ''.join([x + y for x, y in zip(s1, s2)])
# Returns: 'bbllaa'
zip(s1, s2)
# Returns: [('b', 'b'), ('l', 'l'), ('a', 'a')]
丢弃在s1中没有对应关系的s2的其余部分,这就是你想要的。
现在是一个简单的列表理解,可以'加入'所有x和y的
[x + y for x, y in zip(s1, s2)]
# Returns: ['bb', 'll', 'aa']
好吧,加入会按照它说的做,加入一个字符串列表。
''.join(['bb', 'll', 'aa'])
# Returns: 'bbllaa'
所以一起
''.join([x + y for x, y in zip(s1, s2)])
# Returns: 'bbllaa'