首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中的字母表上创建循环迭代器?

如何在Python中的字母表上创建循环迭代器?
EN

Stack Overflow用户
提问于 2017-12-11 19:00:22
回答 3查看 1.5K关注 0票数 2

鉴于以下情况:

代码语言:javascript
复制
import string

UPPERCASE_ALPHABET = list(string.ascii_uppercase)
LOWERCASE_ALPHABET = list(string.ascii_lowercase)

如何在字母跳跃N个位置上创建循环循环?

示例1

字母= a,跳转=5

结果:F

示例2

字母= z,跳转=5

结果:e

到目前为止,我得到:

代码语言:javascript
复制
import string

UPPERCASE_ALPHABET = list(string.ascii_uppercase)
LOWERCASE_ALPHABET = list(string.ascii_lowercase)

def forward(letter, jump):
    alphabet = LOWERCASE_ALPHABET if letter.islower() else UPPERCASE_ALPHABET
    index = alphabet.index(letter)
    count = 0
    while True:
        if count == jump:
            return alphabet[index]

        if index == len(alphabet):            
            index = 0

        index += 1
        count += 1

print forward('a', 5)
print forward('z', 5)

但它看起来一点也不像毕达腾.

有更好的和毕达通的方法来做这件事吗?可能使用chr(ord('N') +位置)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-11 19:34:44

我认为你对ordchr的看法是正确的

代码语言:javascript
复制
import string

def forward(letter, jump):
    if letter.islower():
        start_character = ord('a')
    else:
        start_character = ord('A')
    start = ord(letter) - start_character
    offset = ((start + jump) % 26) + start_character
    result = chr(offset)
    return result

print forward('a', 5)
print forward('z', 5)
print forward('z', 1)
print forward('a', 26)
print forward('A', 5)
print forward('Z', 5)
print forward('Z', 1)
print forward('A', 26)

输出

代码语言:javascript
复制
f
e
a
a
F
E
A
A
票数 1
EN

Stack Overflow用户

发布于 2017-12-11 19:22:38

我会编写一个自定义迭代器类来封装itertools.cycle()并提供skip()功能,例如:

代码语言:javascript
复制
import itertools

class CyclicSkipIterator(object):

    def __init__(self, iterable):
        self._iterator = itertools.cycle(iterable)

    def __iter__(self):
        return self

    def next(self):  # use __next__ on Python 3.x
        return next(self._iterator)

    def skip(self, number=1):
        for i in xrange(number):  # use range() on Python 3.x
            next(self._iterator)

然后你就可以用它做你想做的事:

代码语言:javascript
复制
import string

LOWERCASE_ALPHABET = list(string.ascii_lowercase)

lower_iter = CyclicSkipIterator(LOWERCASE_ALPHABET)
print(next(lower_iter))  # a
lower_iter.skip(4)  # skip next 4 letters: b, c, d, e
print(next(lower_iter))  # f
lower_iter.skip(19)  # skip another 19 letters to arrive at z
print(next(lower_iter))  # z
lower_iter.skip(4)  # skip next 4 letters: a, b, c, d
print(next(lower_iter))  # e

如果你愿意的话,你可以添加更多的功能,比如倒车,切换迭代,中间迭代等等。

UPDATE:如果要跳转到列表中的特定元素,可以将该方法添加到CyclicSkipIterator

代码语言:javascript
复制
class CyclicSkipIterator(object):

    def __init__(self, iterable):
        self._iterator = itertools.cycle(iterable)

    def __iter__(self):
        return self

    def __next__(self):  # use __next__ on Python 3.x
        return next(self._iterator)

    def skip(self, number=1):
        for _ in range(number):  # use range() on Python 3.x
            next(self._iterator)

    def skip_to(self, element, max_count=100):  # max_count protects against endless cycling
        max_count = max(1, max_count)  # ensure at least one iteration
        for _ in range(max_count):  # use range() on Python 3.x
            e = next(self._iterator)
            if element == e:
                break

然后你可以skip_to任何你想要的信件:

代码语言:javascript
复制
import string

LOWERCASE_ALPHABET = list(string.ascii_lowercase)

lower_iter = CyclicSkipIterator(LOWERCASE_ALPHABET)
print(next(lower_iter))  # a
lower_iter.skip(4)  # skip 4 letters: b, c, d, e
print(next(lower_iter))  # f
lower_iter.skip_to("y")  # skip all letters up to y
print(next(lower_iter))  # z
lower_iter.skip(4)  # skip 4 letters: a, b, c, d
print(next(lower_iter))  # e
票数 1
EN

Stack Overflow用户

发布于 2020-10-17 10:25:25

代码语言:javascript
复制
class CyclicIterator:
    def __init__(self,lst):
        self.lst=lst
        self.i=0
    def __iter__(self):
        return self
    def __next__(self):
        result=self.lst[self.i % len(self.lst)]
        self.i+=3   #increasing by 3
        return result

具有iter()和next()的类满足迭代器协议。创建此迭代器类的实例

代码语言:javascript
复制
iter_cycle=CyclicIterator('abcdefghiijklmnnoprstuvyz')

numbers=range(1,27,3) # 26 letters increases by 3
list(zip(list(numbers),iter_cycle))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47759611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档