我如何从列表中每个字符串中取出第一个字符,将它们连接在一起,然后从每个字符串中取出第二个字符,将它们连接在一起,依此类推-最终创建一个组合字符串?
例如如果我有这样的字符串:
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
上。
我该如何改善?
答案 0 :(得分:3)
通常可以使用itertools
优雅地解决以某种复杂的顺序进行迭代的问题。
您可以同时使用zip
和itertools.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())