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

2 投票
3 回答
784 浏览
提问于 2025-04-17 07:05

我在做这个任务的时候遇到了困难,同时我也在想,可能有更好的方法来写这段代码,而不是我现在尝试的方式。

我有一行文字和一个关键词。我想要创建一个新的列表,逐个字符地遍历每个列表。这个关键词会一直重复,直到列表的末尾。如果遇到任何不是字母的字符,就不使用关键词的字母。

举个例子:

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 用来获取这个重复序列中的下一个字符。生成器表达式 会选择下一个关键字字母和文本字符的配对,如果文本字符是字母,就选择这对;如果不是字母,就只选择这个非字母字符。

撰写回答