programing

파이썬 목록을 다른 "하위 목록"으로 분할합니다(예: 더 작은 목록).

itsource 2022. 11. 3. 22:07
반응형

파이썬 목록을 다른 "하위 목록"으로 분할합니다(예: 더 작은 목록).

1000에 달하는 파이썬 리스트가 있어요예를 들어 다음과 같습니다.

data=["I","am","a","python","programmer".....]

여기서 len(data)= 1003이라고 합니다.

이 리스트(데이터)의 서브셋을 작성하려면 , orginal 리스트를 100의 청크로 분할합니다.그래서 마지막으로, Id는 다음과 같은 것을 원합니다.

data_chunk1=[.....] #first 100 items of list data
data_chunk2=[.....] #second 100 items of list data
.
.
.
data_chunk11=[.....] # remainder of the entries,& its len <=100, len(data_chunk_11)=3

이 과제를 달성할 수 있는 비토닉한 방법이 있나요?물론 데이터[0:100] 등을 사용할 수 있지만, 이것은 매우 비피톤적이고 매우 비효율적이라고 생각합니다.

대단히 고맙습니다.

라고 할 수 있을 것 같다

chunks = [data[x:x+100] for x in range(0, len(data), 100)]

3.x 대신 python 2.x를 사용하는 경우 를 사용하여 메모리 효율을 높일 수 있습니다.xrange()위의 코드를 다음과 같이 변경합니다.

chunks = [data[x:x+100] for x in xrange(0, len(data), 100)]

사실 이 경우 플레인 슬라이스를 사용하는 것이 가장 좋은 해결책이라고 생각합니다.

for i in range(0, len(data), 100):
    chunk = data[i:i + 100]
    ...

슬라이스를 복사하지 않으려면itertools.islice()하지만 여기에서는 그럴 필요가 없는 것 같습니다.

itertools()문서에는 유명한 "grouper" 패턴도 포함되어 있습니다.

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

마지막 청크를 올바르게 처리하려면 수정이 필요하기 때문에 플레인 슬라이스를 사용한 간단한 솔루션이 좋다고 생각합니다.

chunks = [data[100*i:100*(i+1)] for i in range(len(data)/100 + 1)]

이것은 인정된 답변에 해당합니다.예를 들어, 가독성을 위해 10개의 배치로 단축하면 다음과 같습니다.

data = range(35)
print [data[x:x+10] for x in xrange(0, len(data), 10)]
print [data[10*i:10*(i+1)] for i in range(len(data)/10 + 1)]

출력:

[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34]]
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34]]

언급URL : https://stackoverflow.com/questions/9671224/split-a-python-list-into-other-sublists-i-e-smaller-lists

반응형