创建一个列表(元组?)从两个不同大小的列表中

2021-05-13 13:40:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我被困在执行这项任务上,在尝试的同时,我忍不住想有一种比我一直尝试的方式更好的编码方式。在

我有一行文本和一个关键字。我想做一个新的列表,列出每个列表中的每个字符。关键字只会重复它自己,直到列表的末尾。如果有任何非字母字符的关键字字母将不会使用。在

例如:

Keyword="lemon"
Text="hi there!"

会导致

^{pr2}$

有没有一种方法可以告诉python在循环中不断重复字符串(lemon)的字母?在

我是新的编码,所以很抱歉,如果这是解释不好或似乎奇怪!在

3条回答
网友
1楼 ·

这里有一个解决方案:

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!'))

输出

^{pr2}$

itertools.cycle重复遍历一个序列(字符串是一个字符序列)。next从重复序列中获取下一个字符。如果文本字符是字母,generator expression选择下一个关键字字母和文本字符对,否则它只选择非字母字符。在

网友
2楼 ·

你把两个问题混成了一个。第一个问题是:如何从字符串中删除非字母数字字符?有几种方法可以实现,但正则表达式替换是一种不错的方法。在

import re

def removeWhitespace( s ):
    return re.sub( '\s', '', s )

问题的第二部分是关于如何在关键字中循环,直到文本行被消耗。你可以这样写:

^{pr2}$

大多数pythonists都会看到这一点并看到重构的机会。这段代码试图实现的模式是在称为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 ]
网友
3楼 ·

我想您可以在这种情况下使用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])

这给了你:

^{pr2}$

你可以以此作为你操纵的依据。在

相关问题