我有一个字符串'ABCDEFG' 我希望能够按顺序列出每个字符,然后是下一个字符。 实施例
A B
B C
C D
D E
E F
F G
你能告诉我一个有效的方法吗?感谢
答案 0 :(得分:3)
在Python中,字符串已被视为可枚举的字符列表,因此您无需拆分它;它已经“分裂”了。您只需构建子字符串列表即可。
目前还不清楚你想要的结果是什么形式。如果你只想要子串,这就行了:
s = 'ABCDEFG'
[s[i:i+2] for i in range(len(s))]
#=> ['AB', 'BC', 'CD', 'DE', 'EF', 'FG', 'G']
如果您希望对自己是列表而不是字符串,只需在每个字符串上调用list
:
[list([s[i:i+2]) for i in range(len(s))]
#=> [['A', 'B'], ['B', 'C'], ['C', 'D'], ['D', 'E'], ['E', 'F'], ['F', 'G'], ['G']]
如果你想要字符串,但字母之间有空格,请在list
电话后将它们重新加入:
[' '.join(list(s[i:i+2])) for i in range(len(s))]
#=> ['A B', 'B C', 'C D', 'D E', 'E F', 'F G', 'G']
答案 1 :(得分:2)
您需要保留最后一个字符,因此请使用izip_longest
itertools
>>> import itertools
>>> s = 'ABCDEFG'
>>> for c, cnext in itertools.izip_longest(s, s[1:], fillvalue=''):
... print c, cnext
...
A B
B C
C D
D E
E F
F G
G
答案 2 :(得分:1)
def doit(input):
for i in xrange(len(input)):
print input[i] + (input[i + 1] if i != len(input) - 1 else '')
doit("ABCDEFG")
哪个收益率:
>>> doit("ABCDEFG")
AB
BC
CD
DE
EF
FG
G
答案 3 :(得分:0)
如果你想在角色之间留出空格,你可以使用zip
功能和列表理解:
>>> s="ABCDEFG"
>>> l=[' '.join(i) for i in zip(s,s[1:])]
['A B', 'B C', 'C D', 'D E', 'E F', 'F G']
>>> for i in l:
... print i
...
A B
B C
C D
D E
E F
F G
如果你不想要空间,只需使用列表理解:
>>> [s[i:i+2] for i in range(len(s))]
['AB', 'BC', 'CD', 'DE', 'EF', 'FG', 'G']
答案 4 :(得分:0)
您的问题是您有一个字符串列表,而不是字符串:
with open('ref.txt') as f:
f1 = f.read().splitlines()
f.read()
返回一个字符串。您可以在其上调用splitlines()
,获取字符串列表(每行一个)。如果您的输入实际上是'ABCDEFG'
,那么这当然是一个字符串['ABCDEFG']
的列表。
l = list(f1)
由于f1
已经是一个列表,这只会使l
成为该列表的副本。
print l, f1, len(l)
这只是打印行列表,行列表的副本和行数。
首先,如果放弃splitlines()
会发生什么?然后f1
将是字符串'ABCDEFG'
,而不是包含该字符串的列表。这是一个好的开始。您可以完全删除l
部分,因为f1
已经是其字符的可迭代部分; list(f1)
只是相同字符的不同迭代。
所以,现在你要用下一个字母打印每个字母。一种方法是zip
ping 'ABCDEFG'
和'BCDEFG '
。但是你如何得到'BCDEFG '
?简单;它只是f1[1:] + ' '
。
所以:
with open('ref.txt') as f:
f1 = f.read()
for left, right in zip(f1, f1[1:] + ' '):
print left, right
当然,对于这么简单的事情,还有很多其他方法可以做同样的事情。您可以迭代range(len(f1))
并获得2个元素的切片,或者您可以使用itertools.zip_longest
,或者您可以编写一个通用的“从任何可迭代的”大小为N的相邻组“itertools.tee
1}}和zip
等等。
答案 5 :(得分:0)
确切地说这个用例是itertools pairwise recipe:
import itertools
def pairwise(myStr):
a,b = itertools.tee(myStr)
next(b,None)
for s1,s2 in zip(a,b):
print(s1,s2)
输出:
In [121]: pairwise('ABCDEFG')
A B
B C
C D
D E
E F
F G