IT

python으로 목록을 채우는 내장 기능

itgroup 2023. 4. 23. 10:16
반응형

python으로 목록을 채우는 내장 기능

사이즈 < N의 리스트가 있는데, 값을 붙여 사이즈 N까지 패딩하고 싶습니다.

물론 다음과 같은 것을 사용할 수 있습니다만, 뭔가 놓치고 있는 것이 있을 것 같습니다.

>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
a += [''] * (N - len(a))

변경하기 싫으면a제자리하여

new_a = a + [''] * (N - len(a))

언제든지 목록의 하위 클래스를 만들고 원하는 메서드를 호출할 수 있습니다.

class MyList(list):
    def ljust(self, n, fillvalue=''):
        return self + [fillvalue] * (n - len(self))

a = MyList(['1'])
b = a.ljust(5, '')

나는 이 접근법이 좀 더 시각적이고 버마틱하다고 생각한다.

a = (a + N * [''])[:N]

이 기능을 내장하고 있지 않습니다.다만, 태스크의 빌트인(또는 임의의 :p)을 작성할 수 있습니다.

(itertool에서 변경)padnone그리고.take레시피)

from itertools import chain, repeat, islice

def pad_infinite(iterable, padding=None):
   return chain(iterable, repeat(padding))

def pad(iterable, size, padding=None):
   return islice(pad_infinite(iterable, padding), size)

사용방법:

>>> list(pad([1,2,3], 7, ''))
[1, 2, 3, '', '', '', '']

more-itertools 는, 이러한 종류의 문제에 대응하는 특별한 툴이 포함되어 있는 라이브러리입니다.

import more_itertools as mit

list(mit.padded(a, "", N))
# [1, '', '', '', '']

또,more_itertools또한 @kennytm에서 언급한 바와 같이 Python itertools 레시피를 구현하므로 재실장할 필요가 없습니다.

list(mit.take(N, mit.padnone(a)))
# [1, None, None, None, None]

디폴트를 치환하십시오.Nonepadding, 목록 이해 사용:

["" if i is None else i for i in mit.take(N, mit.padnone(a))]
# [1, '', '', '', '']

gnibbler의 답변이 더 좋지만 빌트인이 필요한 경우 ( )를 사용할 수 있습니다.zip_longest(Py3k):

itertools.izip_longest( xrange( N ), list )

그러면 튜플 목록이 반환됩니다.( i, list[ i ] )[없음(None)]에 입력됩니다.카운터를 삭제할 필요가 있는 경우는, 다음과 같은 조작을 실시합니다.

map( itertools.itemgetter( 1 ), itertools.izip_longest( xrange( N ), list ) )

빌트인 없이 단순한 제너레이터를 사용할 수도 있습니다.그러나 저는 목록을 패딩하는 것이 아니라 애플리케이션 로직이 빈 목록을 처리하도록 하겠습니다.

어쨌든 빌트인 없는 반복기

def pad(iterable, padding='.', length=7):
    '''
    >>> iterable = [1,2,3]
    >>> list(pad(iterable))
    [1, 2, 3, '.', '.', '.', '.']
    '''
    for count, i in enumerate(iterable):
        yield i
    while count < length - 1:
        count += 1
        yield padding

if __name__ == '__main__':
    import doctest
    doctest.testmod()

' 대신 '없음'으로 패드를 채우는 경우 map()은 다음 작업을 수행합니다.

>>> map(None,[1,2,3],xrange(7))

[(1, 0), (2, 1), (3, 2), (None, 3), (None, 4), (None, 5), (None, 6)]

>>> zip(*map(None,[1,2,3],xrange(7)))[0]

(1, 2, 3, None, None, None, None)
extra_length = desired_length - len(l)
l.extend(value for _ in range(extra_length))

따라서 목록 작성 및 추가에 의존하는 솔루션과 달리 추가 할당이 필요하지 않습니다.[value] * extra_length. "확장" 메서드가 먼저 호출합니다.__length_hint__에 대한 할당을 확장합니다.l반복기에서 입력하기 전에 그 정도만 입력해 주세요.

사용할 수 있습니다.* 반복 가능한 포장 풀기 연산자:

N = 5
a = [1]

pad_value = ''
pad_size = N - len(a)

final_list = [*a, *[pad_value] * pad_size]
print(final_list)

출력:

[1, '', '', '', '']

kennytm에서 벗어나려면:

def pad(l, size, padding):
    return l + [padding] * abs((len(l)-size))

>>> l = [1,2,3]
>>> pad(l, 7, 0)
[1, 2, 3, 0, 0, 0, 0]

반복기 사용 및 기본 인수 활용:

i = iter(a)
a = [next(i, '') for _ in range(N)]

간단한 설명:

어느 쪽이든 우리가 원하는 것은N아이템. 따라서for _ in range(N)그럼 우리가 할 수 있는 한 많은 요소들이 있어야지a그리고 나머지.''. 반복기 사용a모든 가능한 요소들을 잡아서StopIteration기본값이 반환됩니다.''.

요소 목록 앞에 패딩 추가

a[:0] += [''] * (N - len(a))

요소 목록 뒤에 패딩 추가

a += [''] * (N - len(a))

에 " " 를 한다.np.repeat:

import numpy as np
a + list(np.repeat([''], (N - len(a))))

빈 요소로 목록을 채우는 비음법적인 방법은 목록 이해를 사용하는 것입니다.

        my_list = [1,2]
        desired_len = 3
        # Ensure that the length of my list is 3 elements
        [my_list.extend(['']) for _ in range(desired_len - len(my_list))]
        [my_list.pop() for _ in range(len(my_list)-desired_len )]

언급URL : https://stackoverflow.com/questions/3438756/some-built-in-to-pad-a-list-in-python

반응형