파이썬에서 목록을 채우는 내장


110

사이즈 목록이 있습니다 < N 있고 크기 N까지 값을 채우고 싶습니다.

확실히 다음과 같은 것을 사용할 수 있지만 놓친 것이 있어야한다고 생각합니다.

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

왜 이렇게 하시겠습니까? 아마도 더 나은 방법이있을 것입니다.
카트리 엘

목록을 고정 된 수의 열이있는 탭으로 구분 된 문자열로 직렬화합니다.
newtover 2010 년

'\ t'.join ([1,' ',' ',' ',' '])과 같은 것을하고 있다는 뜻입니까? 구현하려는 것에 대해 더 자세히 알려 주시면 아이디어를 생각해 낼 수 있습니다.
satoru

@ Satoru.Logic : 예, 인쇄 >> a_stream, '\ t'.join (the_list) 은 내가 구현하고 싶은 전부입니다
newtover

답변:


165
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, '')

3
이 모습은 더 나은,하지만 난 여전히 같은 기대 채우기 또는 패드 ) 방법 또는 기능 =
newtover

30

이 접근 방식은 더 시각적이고 비단뱀 적이라고 생각합니다.

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

이해하는 데 30 분이 걸립니다. 받아 들여지는 대답은 훨씬 더 간단합니다.
리처드 몬

3
@ RichardMöhn "pythonic"은 "idiomatic"을 의미합니다. Python을 오래 사용할수록이 구문을 더 자연스럽게 찾을 수 있습니다.
Nuno André 19

4
나는 'pythonic'이 무엇을 의미하는지 압니다. 그리고 저는 2014 년부터 계속해서 파이썬을 사용하고 있습니다. 아직도 당신의 대답이 자연스럽지 않습니다.
Richard Möhn

중간 일회용 목록을 만드는 것이 비단뱀처럼 만드는 이유는 무엇입니까?
DylanYoung

1
@DylanYoung 이것은 첫 번째 경우가 아닙니다 N < len(a). 귀하가 제공 한 두 번째 답변의 경우입니다.
kon psych

25

이를위한 내장 기능이 없습니다. 그러나 당신은 당신의 작업 (또는 무엇이든 : p)에 대한 내장을 작성할 수 있습니다.

(itertool padnonetake레시피 에서 수정 됨 )

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, '', '', '', '']

6

gnibbler의 대답은 더 좋지만 내장 기능이 필요한 경우 itertools.izip_longest( zip_longestPy3k에서) 사용할 수 있습니다 .

itertools.izip_longest( xrange( N ), list )

( i, list[ i ] )None으로 채워진 튜플 목록을 반환합니다 . 카운터를 제거해야하는 경우 다음과 같이하십시오.

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

1
나는 izip_longest 에 대해 알고 있었지만 그 결과 코드가 멋지게 보이지 않습니다 =)
newtover

2
나는 당신이 의미한다고 믿습니다 operator.itemgetter(). 또한 None값을 "".
pylang

5

빌드 인없이 간단한 생성기를 사용할 수도 있습니다. 그러나 목록을 채우지 않고 응용 프로그램 논리가 빈 목록을 처리하도록합니다.

어쨌든 빌드가없는 반복자

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()

4

''대신 None으로 채우려면 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)

2
솔직히 말하면 a + [ ''] * (N-len (a)) 가 훨씬 더 선명 해 보입니다. 게다가 목록에 캐스팅이 부족합니다. 어쨌든 감사합니다.
newtover 2011 년

4

more-itertoolspadded이러한 종류의 문제에 대한 특수 도구를 포함하는 라이브러리입니다 .

import more_itertools as mit

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

또는 @kennytm에서 언급 한대로 및 포함 more_itertools하는 Python itertools 레시피 도 구현 하므로 다시 구현할 필요가 없습니다.padnonetake

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

기본 None패딩 을 바꾸려면 목록 이해를 사용하십시오.

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

2

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]


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

이렇게하면 목록 생성 및 추가에 의존하는 솔루션과 달리 추가 할당이 방지됩니다 [value] * extra_length. "extend"메소드는 먼저 __length_hint__반복기를 호출 하고 반복기에서 l채우기 전에 할당을 그만큼 확장 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.