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]
디폴트를 치환하십시오.None
padding, 목록 이해 사용:
["" 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
'IT' 카테고리의 다른 글
EPplus를 사용하여 Excel로 DataTable 내보내기 (0) | 2023.04.23 |
---|---|
웨서버 구성 설정을 사용하여 IIS 7에서 개별 파일의 캐시를 비활성화하려면 어떻게 해야 합니까? (0) | 2023.04.23 |
Larabel에서 Excel로 Excel을 내보낼 때 어떻게 열 헤더를 포함할 수 있습니까? (0) | 2023.04.23 |
T-SQL을 사용하여 두 정수 값을 나누어 부동 결과를 얻는 방법은 무엇입니까? (0) | 2023.04.23 |
코코아 앱에서 터미널 명령 실행 (0) | 2023.04.23 |