Program Tip

Python의 순환 목록 반복기

programtip 2020. 10. 4. 13:13
반응형

Python의 순환 목록 반복기


마지막으로 방문한 항목부터 시작할 때마다 순환 목록을 여러 번 반복해야합니다.

유스 케이스는 연결 풀입니다. 클라이언트는 연결을 요청하고 반복자는 지정 연결이 사용 가능한지 확인하고이를 반환합니다. 그렇지 않으면 사용 가능한 연결을 찾을 때까지 반복합니다.

Python에서 깔끔하게 수행 할 수있는 방법이 있습니까?


를 사용 itertools.cycle하면 정확한 목적이 있습니다.

from itertools import cycle

lst = ['a', 'b', 'c']

pool = cycle(lst)

for item in pool:
    print item,

산출:

a b c a b c ...

(분명히 영원히 반복)


반복자를 수동으로 진행하고 하나씩 값을 가져 오려면 next(pool)다음을 호출하면됩니다 .

>>> next(pool)
'a'
>>> next(pool)
'b'

정답은 itertools.cycle 을 사용하는 것 입니다. 그러나 라이브러리 함수가 존재하지 않는다고 가정 해 봅시다. 어떻게 구현 하시겠습니까?

발전기 사용 :

def circular():
    while True:
        for connection in ['a', 'b', 'c']:
            yield connection

그런 다음 for문을 사용하여 무한 반복하거나 next()생성기 반복기에서 단일 다음 값을 가져 오기 위해 호출 할 수 있습니다 .

connections = circular()
next(connections) # 'a'
next(connections) # 'b'
next(connections) # 'c'
next(connections) # 'a'
next(connections) # 'b'
next(connections) # 'c'
next(connections) # 'a'
#....

또는 다음과 같이 할 수 있습니다.

conn = ['a', 'b', 'c', 'c', 'e', 'f']
conn_len = len(conn)
index = 0
while True:
    print(conn[index])
    index = (index + 1) % conn_len

abcdefab c를 인쇄합니다 ... 영원히


append(pop())루프로 이를 수행 할 수 있습니다 .

l = ['a','b','c','d']
while 1:
    print l[0]
    l.append(l.pop(0))

또는 for i in range()루프 :

l = ['a','b','c','d']
ll = len(l)
while 1:
    for i in range(ll):
       print l[i]

또는 간단히 :

l = ['a','b','c','d']

while 1:
    for i in l:
       print i

모두 인쇄 :

>>>
a
b
c
d
a
b
c
d
...etc.

세 가지 중 나는 함수로 append (pop ()) 접근 방식을 사용하는 경향이 있습니다.

servers = ['a','b','c','d']

def rotate_servers(servers):
    servers.append(servers.pop(0))
    return servers

while 1:
    servers = rotate_servers(servers)
    print servers[0]

n시간 을 순환 하려면 ncycles itertools 레시피를 구현하십시오 .

from itertools import chain, repeat


def ncycles(iterable, n):
    "Returns the sequence elements n times"
    return chain.from_iterable(repeat(tuple(iterable), n))


list(ncycles(["a", "b", "c"], 3))
# ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']

사용자 지정 반복자가 필요합니다 . 이 답변 에서 반복자를 적용하겠습니다 .

from itertools import cycle

class ConnectionPool():
    def __init__(self, ...):
        # whatever is appropriate here to initilize
        # your data
        self.pool = cycle([blah, blah, etc])
    def __iter__(self):
        return self
    def __next__(self):
        for connection in self.pool:
            if connection.is_available:  # or however you spell it
                return connection

참고 URL : https://stackoverflow.com/questions/23416381/circular-list-iterator-in-python

반응형