从两个不同大小的列表创建一个元组列表?
我在做这个任务的时候遇到了困难,同时我也在想,可能有更好的方法来写这段代码,而不是我现在尝试的方式。
我有一行文字和一个关键词。我想要创建一个新的列表,逐个字符地遍历每个列表。这个关键词会一直重复,直到列表的末尾。如果遇到任何不是字母的字符,就不使用关键词的字母。
举个例子:
Keyword="lemon"
Text="hi there!"
最后会得到
('lh', 'ei', ' ', 'mt' , 'oh', 'ne', 'lr', 'ee', '!')
有没有办法让Python在一个循环中不断地重复遍历一个字符串,比如一直遍历“lemon”这个词的字母?
我刚开始学习编程,所以如果这个解释不太清楚或者听起来奇怪,请多多包涵!
3 个回答
1
我觉得在这种情况下,你可以使用 enumerate
:
# remove unwanted stuff
l = [ c for c in Text if c.isalpha() ]
for n,k in enumerate(l):
print n, (Keyword[n % len(Keyword)], Text[l])
这样你就得到了:
0 ('l', 'h')
1 ('e', 'i')
2 ('m', 't')
3 ('o', 'h')
4 ('n', 'e')
5 ('l', 'r')
6 ('e', 'e')
你可以把这个作为你操作的基础。
3
你提了两个问题合在一起了。第一个问题是:怎么从一个字符串中去掉非字母数字的字符?有几种方法可以做到这一点,但用正则表达式替换是一种不错的方法。
import re
def removeWhitespace( s ):
return re.sub( '\s', '', s )
第二个问题是关于如何不断循环关键词,直到文本行被完全处理。你可以这样写:
def characterZip( keyword, textline ):
res = []
textline = removeWhitespace(textline)
textlen = len(textline)
for i in xrange(textlen)):
res.append( '%s%s' % (keyword[i%len(keyword)], textline[i]) )
return res
大多数Python爱好者看到这个代码后,会觉得可以进行一些优化。这个代码试图实现的模式在函数式编程中被称为zip
。有趣的是,在这种情况下,你对关键词的重复字符做了一些稍微不常规的处理,这里也有一个对应的功能,就是itertools模块中的cycle函数。
from itertools import cycle, islice, izip
def characterZip( keyword, textline ):
textline = removeWhitespace(textline)
textlen = len(textline)
it = islice( izip(cycle(keyword), textline), textlen )
return [ '%s%s' % val for val in it ]
2
这里有一个解决方案:
import itertools
def task(kw,text):
i = itertools.cycle(kw)
return tuple(next(i)+t if t.isalpha() else t for t in text)
print(task('lemon','hi there!'))
输出结果
('lh', 'ei', ' ', 'mt', 'oh', 'ne', 'lr', 'ee', '!')
itertools.cycle 是一个可以重复遍历一个序列的工具(字符串就是由字符组成的序列)。next 用来获取这个重复序列中的下一个字符。生成器表达式 会选择下一个关键字字母和文本字符的配对,如果文本字符是字母,就选择这对;如果不是字母,就只选择这个非字母字符。