수색…


통사론

  • import itertools

함수를 사용하여 반복 가능한 객체의 항목 그룹화

그룹화 할 필요가있는 iterable로 시작하십시오.

lst = [("a", 5, 6), ("b", 2, 4), ("a", 2, 5), ("c", 2, 6)]

그룹화 된 생성기를 생성하고 각 튜플의 두 번째 요소별로 그룹화합니다.

def testGroupBy(lst):
    groups = itertools.groupby(lst, key=lambda x: x[1])
    for key, group in groups:
        print(key, list(group))

testGroupBy(lst)

# 5 [('a', 5, 6)]
# 2 [('b', 2, 4), ('a', 2, 5), ('c', 2, 6)]

연속 된 요소 그룹 만 그룹화됩니다. 예를 들어 groupby를 호출하기 전에 동일한 키로 정렬해야 할 수도 있습니다 (마지막 요소가 변경됨)

lst = [("a", 5, 6), ("b", 2, 4), ("a", 2, 5), ("c", 5, 6)]
testGroupBy(lst)

# 5 [('a', 5, 6)]
# 2 [('b', 2, 4), ('a', 2, 5)]
# 5 [('c', 5, 6)]

groupby가 반환 한 그룹은 다음 반복 전에 무효화 될 반복자입니다. 예를 들어, 그룹을 키순으로 정렬하려면 다음이 작동하지 않습니다. 그룹 2를 가져 오면 5가 무효화되므로 그룹 5는 비어 있습니다.

lst = [("a", 5, 6), ("b", 2, 4), ("a", 2, 5), ("c", 2, 6)]
groups = itertools.groupby(lst, key=lambda x: x[1])
for key, group in sorted(groups):
    print(key, list(group))

# 2 [('c', 2, 6)]
# 5 []

정렬을 제대로하려면 정렬 전에 반복기에서 목록을 만듭니다.

groups = itertools.groupby(lst, key=lambda x: x[1])
for key, group in sorted((key, list(group)) for key, group in groups):
    print(key, list(group))
      
# 2 [('b', 2, 4), ('a', 2, 5), ('c', 2, 6)]
# 5 [('a', 5, 6)]

발전기 한 조각을 가져 가라.

Itertools "islice"를 사용하면 생성기를 슬라이스 할 수 있습니다.

results = fetch_paged_results()  # returns a generator
limit = 20  # Only want the first 20 results
for data in itertools.islice(results, limit):
    print(data)

일반적으로 생성기는 슬라이스 할 수 없습니다.

def gen():
    n = 0
    while n < 20:
        n += 1
        yield n

for part in gen()[:3]:
    print(part)

줄게

Traceback (most recent call last):
  File "gen.py", line 6, in <module>
    for part in gen()[:3]:
TypeError: 'generator' object is not subscriptable

그러나,이 작품 :

import itertools

def gen():
    n = 0
    while n < 20:
        n += 1
        yield n

for part in itertools.islice(gen(), 3):
    print(part)

일반 슬라이스와 마찬가지로 start , stopstep 인수를 사용할 수도 있습니다.

itertools.islice(iterable, 1, 30, 3)

itertools.product

이 함수는 반복 가능한 목록의 데카르트 곱을 반복 할 수있게합니다.

예를 들어,

for x, y in itertools.product(xrange(10), xrange(10)):
    print x, y

~에 해당합니다.

for x in xrange(10):
    for y in xrange(10):
        print x, y

가변 개수의 인수를 허용하는 모든 파이썬 함수와 마찬가지로 * 연산자를 사용하여 언팩하기 위해 itertools.product에 목록을 전달할 수 있습니다.

그러므로,

its = [xrange(10)] * 2
for x,y in itertools.product(*its):
    print x, y

앞의 두 예와 동일한 결과를 산출합니다.

>>> from itertools import product
>>> a=[1,2,3,4]
>>> b=['a','b','c']
>>> product(a,b)
<itertools.product object at 0x0000000002712F78>
>>> for i in product(a,b):
...     print i
...
(1, 'a')
(1, 'b')
(1, 'c')
(2, 'a')
(2, 'b')
(2, 'c')
(3, 'a')
(3, 'b')
(3, 'c')
(4, 'a')
(4, 'b')
(4, 'c')

itertools.count

소개:

이 간단한 함수는 무한 수의 수를 생성합니다. 예를 들면 ...

for number in itertools.count():
    if number > 20:
        break
    print(number)

우리는 끊어야하거나 영원히 인쇄해야합니다!

산출:

0
1
2
3
4
5
6
7
8
9
10

인수 :

count()startstep 이라는 두 개의 인수를 취 step .

for number in itertools.count(start=10, step=4):
    print(number)
    if number > 20:
        break

산출:

10
14
18
22

itertools.takewhile

itertools.takewhile을 사용하면 조건이 처음 False 가 될 때까지 시퀀스의 항목을 가져올 수 있습니다.

def is_even(x):
    return x % 2 == 0


lst = [0, 2, 4, 12, 18, 13, 14, 22, 23, 44]
result = list(itertools.takewhile(is_even, lst))

print(result)
  

이것은 [0, 2, 4, 12, 18] 합니다.

술어를 위반하는 첫 번째 숫자 (즉, 부울 값을 반환하는 함수) is_even13 입니다. takewhile 이 주어진 조건 자에 대해 False 를 생성하는 값을 만나면 빠져 나옵니다.

takewhile 에 의해 생성출력 은 아래 코드에서 생성 된 출력과 유사합니다.

def takewhile(predicate, iterable):
    for x in iterable:
        if predicate(x):
            yield x
        else:
            break

주 : takewhiledropwhile 의해 생성 된 결과의 연결은 원래 반복 가능을 생성합니다.

result = list(itertools.takewhile(is_even, lst)) + list(itertools.dropwhile(is_even, lst))

itertools.dropwhile

itertools.dropwhile를 사용하면 조건이 처음 False 가 된 후 시퀀스에서 항목을 가져올 수 있습니다.

def is_even(x):
    return x % 2 == 0


lst = [0, 2, 4, 12, 18, 13, 14, 22, 23, 44]
result = list(itertools.dropwhile(is_even, lst))

print(result)
  

이 출력은 [13, 14, 22, 23, 44] 입니다.

( 이 예제는 takewhile 의 예제와 동일하지만 dropwhile 사용 dropwhile . )

술어를 위반하는 첫 번째 숫자 (즉, 부울 값을 반환하는 함수) is_even13 입니다. 그 전에 모든 요소는 버려집니다.

dropwhile 에 의해 생성출력 은 아래 코드에서 생성 된 출력과 유사합니다.

def dropwhile(predicate, iterable):
    iterable = iter(iterable)
    for x in iterable:
        if not predicate(x):
            yield x
            break
    for x in iterable:
        yield x

takewhiledropwhile 생성 된 결과의 연결은 원래 반복 가능합니다.

result = list(itertools.takewhile(is_even, lst)) + list(itertools.dropwhile(is_even, lst))

두 개의 반복기가 모두 소모 될 때까지 압축합니다.

내장 함수 zip() 과 유사하게 itertools.zip_longest 는 두 개의 반복 가능 시간 중 짧은 기간의 끝을 넘어서 계속 반복됩니다.

from itertools import zip_longest
a = [i for i in range(5)] # Length is 5
b = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] # Length is 7
for i in zip_longest(a, b):
    x, y = i  # Note that zip longest returns the values as a tuple
    print(x, y)

선택적인 fillvalue 인자가 다음과 같이 전달 될 수 있습니다 (기본값은 '' ) :

for i in zip_longest(a, b, fillvalue='Hogwash!'):
    x, y = i  # Note that zip longest returns the values as a tuple
    print(x, y)

Python 2.6 및 2.7에서는이 함수를 itertools.izip_longest 라고합니다.

Itertools 모듈의 조합 방법

itertools.combinations 는 목록의 k- 결합 순서의 생성자를 리턴합니다.

다른 말로하면 : 그것은 입력리스트의 가능한 모든 k-wise 조합의 튜플 생성자를 반환합니다.

예 :

목록이있는 경우 :

a = [1,2,3,4,5]
b = list(itertools.combinations(a, 2))
print b

산출:

[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]

위의 출력은 입력리스트 a 의 모든 쌍 쌍 조합의 튜플 목록으로 변환 된 생성자입니다

또한 다음 3 가지 조합을 모두 찾을 수 있습니다.

a = [1,2,3,4,5]
b = list(itertools.combinations(a, 3))
print b

산출:

[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4),
 (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5),
 (2, 4, 5), (3, 4, 5)]

여러 개의 반복자 연결하기

itertools.chain 을 사용하여 여러 생성자의 값을 순서대로 생성하는 단일 생성기를 만듭니다.

from itertools import chain
a = (x for x in ['1', '2', '3', '4'])
b = (x for x in ['x', 'y', 'z'])
' '.join(chain(a, b))

결과 :

'1 2 3 4 x y z'

대체 생성자로서, chain.from_iterable 을 사용할 수 있습니다.이 chain.from_iterable 는 하나의 매개 변수로 iterable의 반복 가능을 취합니다. 위와 동일한 결과를 얻으려면 다음과 같이하십시오.

' '.join(chain.from_iterable([a,b])

chain 은 임의의 수의 인수를 취할 수 있지만 chain.from_iterable무한 수의 반복 가능을 연결하는 유일한 방법입니다.

itertools.repeat

n 번 무언가를 반복하십시오 :

>>> import itertools
>>> for i in itertools.repeat('over-and-over', 3):
...    print(i)
over-and-over
over-and-over
over-and-over

반복 가능한 숫자의 누적 합계 가져 오기

파이썬 3.x 3.2

accumulate 하면 누적 합계 (또는 곱)가 산출됩니다.

>>> import itertools as it
>>> import operator

>>> list(it.accumulate([1,2,3,4,5]))
[1, 3, 6, 10, 15]

>>> list(it.accumulate([1,2,3,4,5], func=operator.mul)) 
[1, 2, 6, 24, 120]

반복자의 요소 순환

cycle 은 무한 반복자입니다.

>>> import itertools as it
>>> it.cycle('ABCD')
A B C D A B C D A B C D ...

따라서 이것을 사용하면 무한 루프를 피하기 위해 경계를 지정하는 데주의해야합니다. 예:

>>> # Iterate over each element in cycle for a fixed range
>>> cycle_iterator = it.cycle('abc123')
>>> [next(cycle_iterator) for i in range(0, 10)]
['a', 'b', 'c', '1', '2', '3', 'a', 'b', 'c', '1']

itertools.permutations

itertools.permutations 는 iterable에 연속 된 r-length 순열을 가진 생성자를 리턴한다.

a = [1,2,3]
list(itertools.permutations(a))
# [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

list(itertools.permutations(a, 2))
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

리스트 a 중복 요소가있는 경우 결과 순열에 중복 요소가 생기며 set 를 사용하여 고유 순열을 가져올 수 있습니다.

a = [1,2,1]
list(itertools.permutations(a))
# [(1, 2, 1), (1, 1, 2), (2, 1, 1), (2, 1, 1), (1, 1, 2), (1, 2, 1)]

set(itertools.permutations(a))
# {(1, 1, 2), (1, 2, 1), (2, 1, 1)}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow