从多个字符串中依次获取字符

时间:2019-02-13 12:39:32

标签: python python-3.x

我如何从列表中每个字符串中取出第一个字符,将它们连接在一起,然后从每个字符串中取出第二个字符,将它们连接在一起,依此类推-最终创建一个组合字符串?

例如如果我有这样的字符串:

homanif
eiesdnt
ltiwege
lsworar

我希望最终结果为helloitsmeiwaswonderingafter

我整理了一个非常老套的版本,该版本可以完成工作,但会产生更多乱码。考虑到这很容易使索引超出范围,我认为这不是一个好方法:

final_c = ['homanif', 'eiesdnt', 'ltiwege', 'lsworar']

final_message = ""
current_char = 0

for i in range(len(final_c[1])):
    for c in final_c:
        final_message += c[current_char]
    current_char += 1

final_message += final_c[0][:-1]    

print(final_message)    

给我helloitsmeiwaswonderingafterhomani,让它停在helloitsmeiwaswonderingafter上。

我该如何改善?

5 个答案:

答案 0 :(得分:3)

通常可以使用itertools优雅地解决以某种复杂的顺序进行迭代的问题。

使用邮政编码

您可以同时使用zipitertools.chain

from itertools import chain

final_c = ['homanif', 'eiesdnt', 'ltiwege', 'lsworar']
final_message = ''.join(chain.from_iterable(zip(*final_c))) # 'helloitsmeiwaswonderingafter'

如果您需要final_c中的字符串具有不同的长度,则可以使用itertools.zip_longest来稍微调整代码。

final_message = ''.join(filter(None, chain.from_iterable(zip_longest(*final_c))))

使用周期

itertools的有趣之处在于,它为迭代对象提供了许多聪明的简短解决方案。这是另一个使用itertools.cycle的东西。

from itertools import cycle

final_c = ['homanif', 'eiesdnt', 'ltiwege', 'lsworara']
final_message = ''.join(next(w) for w in cycle(iter(w) for w in final_c))

答案 1 :(得分:2)

您可以使用嵌套的理解:

x = ["homanif", 
     "eiesdnt", 
     "ltiwege", 
     "lsworar"] 

y = "".join(x[i][j]
            for j in range(len(x[0]))
            for i in range(len(x)))

或使用嵌套联接和zip

y = "".join("".join(y) for y in zip(*x))     

答案 2 :(得分:1)

以下是对我有用的代码:

final_c = ["homanif", "eiesdnt", "ltiwege", "lsworar"]
final_message = ""
current_char = 0

for i in range(len(final_c[1])):
    for c in final_c:
        final_message += c[current_char]
    current_char += 1

# final_message += final_c[0][:-1]    

print(final_message) 

我希望对您有帮助

答案 3 :(得分:1)

我不明白您对这条线的期望 final_message += final_c[0][:-1]

没有这些代码,代码就可以正常工作。要么删除该行,要么使用类似列表理解的方法:

final_message = "".join(final_c[i][j] for j in range(len(final_c[0])) for i in range(len(final_c)))

这给出了预期的输出:

helloitsmeiwaswonderingafter

答案 4 :(得分:0)

看起来您可以拥有一个nxm形式的矩阵,其中n是单词数,m是单词中的字符数(如果所有单词的长度相同,下面的代码将起作用)

import numpy as np

n = len(final_c)  # number of words in your list
m = len(final_c[0])  # number of character in a word

array = np_array(''.join([list(w) for w in ''.join(final_c)])
# reshape the array 
matrix = array.reshape(n,1,m )
''.join(matrix.transpose().flatten())