【问题标题】:interlacing strings in pythonpython中的交错字符串
【发布时间】:2013-11-25 17:08:40
【问题描述】:

我有一个测试问题,我必须将两个字符串中的字母交织成一个,我使用以下代码完成了:

'abcd' 和 'efghi' -> 'aebfcgdhi'

s1,s2='abcd' ,'efghi'
t=[a+b for a,b in zip(s1, s2) ]
ls1 = len(s1)
ls2 = len(s2)
if ls1 > ls2:
    t.extend(s1[ls2:])
elif ls1 < ls2:
    t.extend(s2[ls1:])
print ''.join(t)

我首先尝试使用以下方法,这似乎仅在字符串长度相同或 s2 是较长字符串时才有效。

 print  ''.join([a+b for a,b in zip(s1, s2)]) + max(s1,s2)[min(len(s1),len(s2)):]

我的逻辑哪里出错了?

【问题讨论】:

  • 预期输出是什么?
  • @thefourtheye 编辑问题以包含预期输出
  • 知道了。请检查我的答案
  • @hcwhsa 我不想使用 itertools,我的问题是如何修改我自己的代码以获得所需的输出,或者是否有可能,以便我能准确理解它是如何工作的。

标签: python string zip


【解决方案1】:

要使您的代码正常工作,您只需在 max 函数中使用 key 参数

print  ''.join([a+b for a,b in zip(s1, s2)]) + max(s1,s2, key=len)[min(len(s1),len(s2)):]

或者,您可以使用itertools.izip_longest 进行迭代,直到两个可迭代对象中最大的一个被用完。因此,无论字符串的长度如何,此解决方案都有效。

import itertools
s1,s2='abcd' ,'efghi'
print "".join(y for x in itertools.izip_longest(s1, s2) for y in x if y)

输出

aebfcgdhi

编辑:

不使用itertools

s1,s2='abcd' ,'efghi'
minLen = min(len(s1), len(s2))
print "".join(y for x in zip(s1, s2) for y in x) + s1[minLen:] + s2[minLen:]

【讨论】:

  • 不使用itertools怎么办?
  • @PadraicCunningham 请立即查看
  • 之前使用max的时候没见过key的使用。就是这么简单,非常感谢
  • @PadraicCunningham 不客气 :) 如果对您有帮助,请考虑支持并接受此答案 :)
【解决方案2】:

不使用itertools.izip_longest

>>> s1, s2 = 'abcd', 'efghi'
>>> l = min(len(s1), len(s2))
>>> ''.join(a+b for a, b in zip(s1, s2)) + s1[l:] + s2[l:]
'aebfcgdhi'

【讨论】:

  • 我知道这是一个非常古老的线程,但是由于您的解决方案运行良好,您能解释一下如何取消交错吗?
  • @shamilpython,请用示例发布一个单独的问题(不是评论)。
猜你喜欢
  • 2018-07-10
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 2013-01-10
  • 2021-06-13
  • 2011-10-11
  • 2015-10-25
  • 1970-01-01
相关资源
最近更新 更多