Listeyi e┼čit boyutta topaklara nas─▒l b├Âlersiniz?


Al─▒nan cevaba git


─░ste─če ba─čl─▒ bir uzunluk listesine sahibim ve e┼čit boyutta par├žalara b├Âlmem ve ├╝zerinde ├žal─▒┼čmam gerekiyor. Bir saya├ž ve iki liste tutmak gibi bunu yapman─▒n baz─▒ a├ž─▒k yollar─▒ vard─▒r ve ikinci liste doldu─čunda, ilk listeye ekler ve ikinci listeyi bir sonraki veri turunda bo┼čalt─▒r, ancak bu potansiyel olarak olduk├ža pahal─▒d─▒r.

Jenerat├Âr kullanarak, herhangi biri i├žin bu listenin herhangi bir uzunlu─čunun iyi bir ├ž├Âz├╝m├╝ olup olmad─▒─č─▒n─▒ merak ediyordum.

─░┼če yarar bir ┼čey ar─▒yordum itertools ama a├ž─▒k├ža yararl─▒ bir ┼čey bulamad─▒m. Yine de ka├ž─▒rm─▒┼č olabilirsiniz.

─░lgili soru: Par├žalardaki bir listeyi yinelemenin en ÔÇťpythonicÔÇŁ yolu nedir?


2033









Cevap say─▒s─▒n─▒ say: 30






─░┼čte istedi─činiz par├žalar─▒ veren bir jenerat├Âr:

 def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]
 

 import pprint
pprint.pprint(list(chunks(range(10, 75), 10)))
[[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, 35, 36, 37, 38, 39],
 [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
 [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
 [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
 [70, 71, 72, 73, 74]]
 

Python 2 kullan─▒yorsan─▒z, xrange() yerine kullanmal─▒s─▒n─▒z range() :

 def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in xrange(0, len(l), n):
        yield l[i:i + n]
 

Ayr─▒ca, bir i┼člevi yazmak yerine liste kavrama i┼člevini kullanabilirsiniz, ancak bu gibi i┼člemleri adland─▒r─▒lm─▒┼č i┼člevlerle kaplamak iyi bir fikirdir, b├Âylece kodunuzun anla┼č─▒lmas─▒ daha kolayd─▒r. Python 3:

 [l[i:i + n] for i in range(0, len(l), n)]
 

Python 2 versiyonu:

 [l[i:i + n] for i in xrange(0, len(l), n)]
 

2775







S├╝per basit bir ┼čey istiyorsan─▒z:

 def chunks(l, n):
    n = max(1, n)
    return (l[i:i+n] for i in xrange(0, len(l), n))
 

Kullan─▒m range() yerine xrange() Python 3.x durumunda


530







Do─črudan (eski) Python belgelerinden (itertools i├žin tarifler):

 from itertools import izip, chain, repeat

def grouper(n, iterable, padvalue=None):
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
    return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)
 

JFSebastian taraf─▒ndan ├Ânerilen mevcut s├╝r├╝m:

 #from itertools import izip_longest as zip_longest # for Python 2.x
from itertools import zip_longest # for Python 3.x
#from six.moves import zip_longest # for both (uses the six compat library)

def grouper(n, iterable, padvalue=None):
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
    return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue)
 

San─▒r─▒m Guido'nun zaman makinesi ├žal─▒┼č─▒yor - ├žal─▒┼čt─▒ - ├žal─▒┼čacak - ├žal─▒┼čacak - tekrar ├žal─▒┼č─▒yordu.

Bu ├ž├Âz├╝mler i┼če yar─▒yor, ├ž├╝nk├╝ [iter(iterable)]*n (veya ├Ânceki s├╝r├╝mdeki e┼čde─čeri) listede tekrarlanan bir yineleyici yarat─▒yor n . izip_longest daha sonra etkin bir ┼čekilde "her" yineleyicinin bir turu ger├žekle┼čtirir; bu ayn─▒ yineleyici oldu─čundan, bu ├ža─čr─▒lar─▒n her biri taraf─▒ndan ilerletilir ve her bir zip-roundrobin ile sonu├žlan─▒r n .


274


2008-11-23





Bunun biraz eski oldu─čunu biliyorum ama hen├╝z kimse bahsetmedi numpy.array_split :

 import numpy as np

lst = range(50)
np.array_split(lst, 5)
# [array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
#  array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),
#  array([20, 21, 22, 23, 24, 25, 26, 27, 28, 29]),
#  array([30, 31, 32, 33, 34, 35, 36, 37, 38, 39]),
#  array([40, 41, 42, 43, 44, 45, 46, 47, 48, 49])]
 

167


2013-06-05





S├╝rpriz kimse kullan─▒lmas─▒n─▒ d├╝┼č├╝nm├╝┼čt├╝r oldu─čum iter s' ─░ki arg├╝man formu :

 from itertools import islice

def chunk(it, size):
    it = iter(it)
    return iter(lambda: tuple(islice(it, size)), ())
 

Demo:

 >>> list(chunk(range(14), 3))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13)]
 

Bu herhangi bir yinelenebilir ile ├žal─▒┼č─▒r ve tembel olarak ├ž─▒kt─▒ ├╝retir. Yineleyicilerden ziyade tote d├Ând├╝r├╝r, ancak yine de kesin bir zarafeti oldu─čunu d├╝┼č├╝n├╝yorum. Ayn─▒ zamanda yast─▒─č─▒ yok; Dolgu istiyorsan─▒z, yukar─▒daki basit bir de─či┼čiklik yeterli olacakt─▒r:

 from itertools import islice, chain, repeat

def chunk_pad(it, size, padval=None):
    it = chain(iter(it), repeat(padval))
    return iter(lambda: tuple(islice(it, size)), (padval,) * size)
 

Demo:

 >>> list(chunk_pad(range(14), 3))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, None)]
>>> list(chunk_pad(range(14), 3, 'a'))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 'a')]
 

Gibi izip_longest tabanl─▒ ├ž├Âz├╝mlerin, yukar─▒da hep pedleri. Bildi─čim kadar─▒yla, iste─če ba─čl─▒ olarak yayan bir i┼člev i├žin bir ya da iki sat─▒rl─▒k itertools tarifi yok . Yukar─▒daki iki yakla┼č─▒m─▒ birle┼čtirerek, bu olduk├ža yakla┼č─▒yor:

 _no_padding = object()

def chunk(it, size, padval=_no_padding):
    if padval == _no_padding:
        it = iter(it)
        sentinel = ()
    else:
        it = chain(iter(it), repeat(padval))
        sentinel = (padval,) * size
    return iter(lambda: tuple(islice(it, size)), sentinel)
 

Demo:

 >>> list(chunk(range(14), 3))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13)]
>>> list(chunk(range(14), 3, None))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, None)]
>>> list(chunk(range(14), 3, 'a'))
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 'a')]
 

Bunun iste─če ba─čl─▒ dolgu malzemesi sunan en k─▒sa chunker oldu─čuna inan─▒yorum.

Tomasz Gandor'un g├Âzlemledi─či gibi, iki dolgu maddesi uzun bir ped de─čeri dizisi ile kar┼č─▒la┼č─▒rlarsa beklenmedik bir ┼čekilde duracakt─▒r. ─░┼čte bu soruna ge├žici bir ┼čekilde cevap veren son bir varyasyon:

 _no_padding = object()
def chunk(it, size, padval=_no_padding):
    it = iter(it)
    chunker = iter(lambda: tuple(islice(it, size)), ())
    if padval == _no_padding:
        yield from chunker
    else:
        for ch in chunker:
            yield ch if len(ch) == size else ch + (padval,) * (size - len(ch))
 

Demo:

 >>> list(chunk([1, 2, (), (), 5], 2))
[(1, 2), ((), ()), (5,)]
>>> list(chunk([1, 2, None, None, 5], 2, None))
[(1, 2), (None, None), (5, None)]
 

118







─░┼čte keyfi yinelemeler ├╝zerinde ├žal─▒┼čan bir jenerat├Âr:

 def split_seq(iterable, size):
    it = iter(iterable)
    item = list(itertools.islice(it, size))
    while item:
        yield item
        item = list(itertools.islice(it, size))
 

├ľrnek:

 >>> import pprint
>>> pprint.pprint(list(split_seq(xrange(75), 10)))
[[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, 35, 36, 37, 38, 39],
 [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
 [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
 [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
 [70, 71, 72, 73, 74]]
 

88







 def chunk(input, size):
    return map(None, *([iter(input)] * size))
 

50







Basit ama ┼č─▒k

 l = range(1, 1000)
print [l[x:x+10] for x in xrange(0, len(l), 10)]
 

veya e─čer tercih ederseniz:

 chunks = lambda l, n: [l[x: x+n] for x in xrange(0, len(l), n)]
chunks(l, 10)
 

45







En harika Python-ish cevab─▒n─▒ bu sorunun bir kopyas─▒nda g├Ârd├╝m :

 from itertools import zip_longest

a = range(1, 16)
i = iter(a)
r = list(zip_longest(i, i, i))
>>> print(r)
[(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12), (13, 14, 15)]
 

Herhangi bir n i├žin n-tuple olu┼čturabilirsiniz. E─čer a = range(1, 15) ├Âyleyse, sonu├ž ┼č├Âyle olacakt─▒r:

 [(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12), (13, 14, None)]
 

Liste e┼čit bir ┼čekilde b├Âl├╝n├╝r, o zaman yerini alabilir zip_longest ile zip aksi ├╝├žl├╝, (13, 14, None) kaybedilecek. Python 3 yukar─▒da kullan─▒lm─▒┼čt─▒r. Python 2 i├žin kullan─▒n izip_longest .


37







Buradaki di─čer cevaplar─▒n ele┼čtirisi:

Bu cevaplar─▒n hi├žbiri e┼čit boyutta topak de─čildir, hepsi sonunda kaba bir par├ža b─▒rak─▒r, bu y├╝zden tam olarak dengelenmemi┼člerdir. ─░┼čleri da─č─▒tmak i├žin bu i┼člevleri kullan─▒yor olsayd─▒n─▒z, birisinin di─čerlerinden ├Ânce iyi bitmesi ihtimalini do─čuruyorsunuz, bu nedenle di─čerleri s─▒k─▒ ├žal─▒┼čmaya devam ederken hi├žbir ┼čey yapmadan oturup duracakt─▒.

├ľrne─čin, mevcut en iyi cevap ┼čununla biter:

 [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
[70, 71, 72, 73, 74]]
 

Sonunda ki bu s─▒├žandan nefret ediyorum!

Di─čerleri gibi list(grouper(3, xrange(7))) , ve chunk(xrange(7), 3) de d├Ân├╝p: [(0, 1, 2), (3, 4, 5), (6, None, None)] . None Nakarat doldurma ve bence olduk├ža zarafetsiz edilir. Yinelemeleri e┼čit ┼čekilde par├žalam─▒yorlar.

Bunlar─▒ neden daha iyi b├Âlemiyoruz?

Benim ├ž├Âz├╝m├╝m

─░┼čte (yerine Python 3'te Not ├╝retiminde kullan─▒lan oldu─čunuz bir fonksiyonu uyarlanan dengeli bir ├ž├Âz├╝m, var xrange olan range ):

 def baskets_from(items, maxbaskets=25):
    baskets = [[] for _ in xrange(maxbaskets)] # in Python 3 use range
    for i, item in enumerate(items):
        baskets[i % maxbaskets].append(item)
    return filter(None, baskets) 
 

Listeye eklerseniz ayn─▒ ┼čeyi yapan bir jenerat├Âr yaratt─▒m:

 def iter_baskets_from(items, maxbaskets=3):
    '''generates evenly balanced baskets from indexable iterable'''
    item_count = len(items)
    baskets = min(item_count, maxbaskets)
    for x_i in xrange(baskets):
        yield [items[y_i] for y_i in xrange(x_i, item_count, baskets)]
 

Ve son olarak, yukar─▒daki fonksiyonlar─▒n hepsinin biti┼čik bir s─▒rada (verildi─či gibi) elemanlar─▒ d├Ând├╝rd├╝─č├╝n├╝ g├Ârd├╝─č├╝mden beri:

 def iter_baskets_contiguous(items, maxbaskets=3, item_count=None):
    '''
    generates balanced baskets from iterable, contiguous contents
    provide item_count if providing a iterator that doesn't support len()
    '''
    item_count = item_count or len(items)
    baskets = min(item_count, maxbaskets)
    items = iter(items)
    floor = item_count // baskets 
    ceiling = floor + 1
    stepdown = item_count % baskets
    for x_i in xrange(baskets):
        length = ceiling if x_i < stepdown else floor
        yield [items.next() for _ in xrange(length)]
 

Çıktı

Bunlar─▒ test etmek i├žin:

 print(baskets_from(xrange(6), 8))
print(list(iter_baskets_from(xrange(6), 8)))
print(list(iter_baskets_contiguous(xrange(6), 8)))
print(baskets_from(xrange(22), 8))
print(list(iter_baskets_from(xrange(22), 8)))
print(list(iter_baskets_contiguous(xrange(22), 8)))
print(baskets_from('ABCDEFG', 3))
print(list(iter_baskets_from('ABCDEFG', 3)))
print(list(iter_baskets_contiguous('ABCDEFG', 3)))
print(baskets_from(xrange(26), 5))
print(list(iter_baskets_from(xrange(26), 5)))
print(list(iter_baskets_contiguous(xrange(26), 5)))
 

Hangi ├ž─▒kt─▒lar:

 [[0], [1], [2], [3], [4], [5]]
[[0], [1], [2], [3], [4], [5]]
[[0], [1], [2], [3], [4], [5]]
[[0, 8, 16], [1, 9, 17], [2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14], [7, 15]]
[[0, 8, 16], [1, 9, 17], [2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14], [7, 15]]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19], [20, 21]]
[['A', 'D', 'G'], ['B', 'E'], ['C', 'F']]
[['A', 'D', 'G'], ['B', 'E'], ['C', 'F']]
[['A', 'B', 'C'], ['D', 'E'], ['F', 'G']]
[[0, 5, 10, 15, 20, 25], [1, 6, 11, 16, 21], [2, 7, 12, 17, 22], [3, 8, 13, 18, 23], [4, 9, 14, 19, 24]]
[[0, 5, 10, 15, 20, 25], [1, 6, 11, 16, 21], [2, 7, 12, 17, 22], [3, 8, 13, 18, 23], [4, 9, 14, 19, 24]]
[[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]]
 

Biti┼čik jenerat├Âr├╝n, di─čer ikisiyle ayn─▒ uzunluktaki ┼čekillerde topaklar─▒ sa─člad─▒─č─▒na dikkat edin, ancak ├Â─čelerin hepsi s─▒ral─▒d─▒r ve ayr─▒ bir ├Â─čelerin bir listesini b├Âlebilece─či kadar e┼čit olarak b├Âl├╝nm├╝┼člerdir.


34







Liste boyutunu biliyorsan─▒z:

 def SplitList(mylist, chunk_size):
    return [mylist[offs:offs+chunk_size] for offs in range(0, len(mylist), chunk_size)]
 

Yapmazsan─▒z (bir yineleyici):

 def IterChunks(sequence, chunk_size):
    res = []
    for item in sequence:
        res.append(item)
        if len(res) >= chunk_size:
            yield res
            res = []
    if res:
        yield res  # yield the last, incomplete, portion
 

─░kinci durumda, dizinin her zaman verilen boyutta ├žok say─▒da topak i├žerdi─činden emin olabilirseniz (yani tamamlanmam─▒┼č son topak olmad─▒─č─▒ndan) emin olabilirseniz, daha g├╝zel bir ┼čekilde yeniden d├╝zenlenebilir.


27


2008-11-23





├ľrne─čin 3 boyutta bir y─▒─č─▒n─▒n─▒z varsa, ┼čunlar─▒ yapabilirsiniz:

 zip(*[iterable[i::3] for i in range(3)]) 
 

kaynak: http://code.activestate.com/recipes/303060-group-a-list-into-sequential-n-tuples/

Bunu, y─▒─č─▒n boyutum sabit say─▒ oldu─čunda, ├Ârne─čin '3' yazabilece─čim ve hi├ž de─či┼čmeyece─či zaman kullan─▒rd─▒m.


16







Toolz k├╝t├╝phanesi vard─▒r partition bunun i├žin i┼člevi:

 from toolz.itertoolz.core import partition

list(partition(2, [1, 2, 3, 4]))
[(1, 2), (3, 4)]
 

16


2013-11-20





Python doc'n─▒n tzot ve JFSebastian taraf─▒ndan ├Ânerilen versiyonunu ├žok seviyorum, ancak iki eksikli─či var:

  • ├žok a├ž─▒k de─čil
  • Genelde son ├Âbekte bir dolum de─čeri istemiyorum

Bunu kodumda ├žok kullan─▒yorum:

 from itertools import islice

def chunks(n, iterable):
    iterable = iter(iterable)
    while True:
        yield tuple(islice(iterable, n)) or iterable.next()
 

G├ťNCELLEME: Bir tembel par├žalar─▒ s├╝r├╝m├╝:

 from itertools import chain, islice

def chunks(n, iterable):
   iterable = iter(iterable)
   while True:
       yield chain([next(iterable)], islice(iterable, n-1))
 

15







Bu noktada, san─▒r─▒m bir ├Âzyinelemeli jenerat├Âre ihtiyac─▒m─▒z var ...

Python 2'de:

 def chunks(li, n):
    if li == []:
        return
    yield li[:n]
    for e in chunks(li[n:], n):
        yield e
 

Python 3'te:

 def chunks(li, n):
    if li == []:
        return
    yield li[:n]
    yield from chunks(li[n:], n)
 

Ayr─▒ca, b├╝y├╝k Alien istilas─▒ durumunda, dekore edilmi┼č bir ├Âzyinelemeli jenerat├Âr kullan─▒┼čl─▒ olabilir:

 def dec(gen):
    def new_gen(li, n):
        for e in gen(li, n):
            if e == []:
                return
            yield e
    return new_gen

@dec
def chunks(li, n):
    yield li[:n]
    for e in chunks(li[n:], n):
        yield e
 

12







Farkl─▒ yakla┼č─▒mlar─▒n performans─▒n─▒ merak ediyordum ve i┼čte burada:

Python 3.5.1 ├╝zerinde test edildi

 import time
batch_size = 7
arr_len = 298937

#---------slice-------------

print("\r\nslice")
start = time.time()
arr = [i for i in range(0, arr_len)]
while True:
    if not arr:
        break

    tmp = arr[0:batch_size]
    arr = arr[batch_size:-1]
print(time.time() - start)

#-----------index-----------

print("\r\nindex")
arr = [i for i in range(0, arr_len)]
start = time.time()
for i in range(0, round(len(arr) / batch_size + 1)):
    tmp = arr[batch_size * i : batch_size * (i + 1)]
print(time.time() - start)

#----------batches 1------------

def batch(iterable, n=1):
    l = len(iterable)
    for ndx in range(0, l, n):
        yield iterable[ndx:min(ndx + n, l)]

print("\r\nbatches 1")
arr = [i for i in range(0, arr_len)]
start = time.time()
for x in batch(arr, batch_size):
    tmp = x
print(time.time() - start)

#----------batches 2------------

from itertools import islice, chain

def batch(iterable, size):
    sourceiter = iter(iterable)
    while True:
        batchiter = islice(sourceiter, size)
        yield chain([next(batchiter)], batchiter)


print("\r\nbatches 2")
arr = [i for i in range(0, arr_len)]
start = time.time()
for x in batch(arr, batch_size):
    tmp = x
print(time.time() - start)

#---------chunks-------------
def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]
print("\r\nchunks")
arr = [i for i in range(0, arr_len)]
start = time.time()
for x in chunks(arr, batch_size):
    tmp = x
print(time.time() - start)

#-----------grouper-----------

from itertools import zip_longest # for Python 3.x
#from six.moves import zip_longest # for both (uses the six compat library)

def grouper(iterable, n, padvalue=None):
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
    return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

arr = [i for i in range(0, arr_len)]
print("\r\ngrouper")
start = time.time()
for x in grouper(arr, batch_size):
    tmp = x
print(time.time() - start)
 

Sonu├žlar:

 slice
31.18285083770752

index
0.02184295654296875

batches 1
0.03503894805908203

batches 2
0.22681021690368652

chunks
0.019841909408569336

grouper
0.006506919860839844
 

12







kod:

 def split_list(the_list, chunk_size):
    result_list = []
    while the_list:
        result_list.append(the_list[:chunk_size])
        the_list = the_list[chunk_size:]
    return result_list

a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print split_list(a_list, 3)
 

sonu├ž:

 [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
 

11







K├╝t├╝phanenin get_chunks i┼člevini a┼ča─č─▒daki gibi de kullanabilirsiniz utilspie :

 >>> from utilspie import iterutils
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> list(iterutils.get_chunks(a, 5))
[[1, 2, 3, 4, 5], [6, 7, 8, 9]]
 

utilspie Pip ile y├╝kleyebilirsiniz :

 sudo pip install utilspie
 

Feragatname: Ben utilspie k├╝t├╝phanesinin yarat─▒c─▒s─▒y─▒m .


11







 [AA[i:i+SS] for i in range(len(AA))[::SS]]
 

AA dizi oldu─čunda, SS y─▒─č─▒n boyutudur. ├ľrne─čin:

 >>> AA=range(10,21);SS=3
>>> [AA[i:i+SS] for i in range(len(AA))[::SS]]
[[10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20]]
# or [range(10, 13), range(13, 16), range(16, 19), range(19, 21)] in py3
 

10







heh, bir sat─▒r versiyonu

 In [48]: chunk = lambda ulist, step:  map(lambda i: ulist[i:i+step],  xrange(0, len(ulist), step))

In [49]: chunk(range(1,100), 10)
Out[49]: 
[[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, 35, 36, 37, 38, 39, 40],
 [41, 42, 43, 44, 45, 46, 47, 48, 49, 50],
 [51, 52, 53, 54, 55, 56, 57, 58, 59, 60],
 [61, 62, 63, 64, 65, 66, 67, 68, 69, 70],
 [71, 72, 73, 74, 75, 76, 77, 78, 79, 80],
 [81, 82, 83, 84, 85, 86, 87, 88, 89, 90],
 [91, 92, 93, 94, 95, 96, 97, 98, 99]]
 

7







 def split_seq(seq, num_pieces):
    start = 0
    for i in xrange(num_pieces):
        stop = start + len(seq[i::num_pieces])
        yield seq[start:stop]
        start = stop
 

kullan─▒m─▒:

 seq = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for seq in split_seq(seq, 3):
    print seq
 

7







Ba┼čka bir daha a├ž─▒k s├╝r├╝m.

 def chunkList(initialList, chunkSize):
    """
    This function chunks a list into sub lists 
    that have a length equals to chunkSize.

    Example:
    lst = [3, 4, 9, 7, 1, 1, 2, 3]
    print(chunkList(lst, 3)) 
    returns
    [[3, 4, 9], [7, 1, 1], [2, 3]]
    """
    finalList = []
    for i in range(0, len(initialList), chunkSize):
        finalList.append(initialList[i:i+chunkSize])
    return finalList
 

7







B├╝y├╝k listeler i├žin iyi olan len () ├ža─č─▒rmadan:

 def splitter(l, n):
    i = 0
    chunk = l[:n]
    while chunk:
        yield chunk
        i += n
        chunk = l[i:i+n]
 

Ve bu tekrarlanabilirler i├žin:

 def isplitter(l, n):
    l = iter(l)
    chunk = list(islice(l, n))
    while chunk:
        yield chunk
        chunk = list(islice(l, n))
 

Yukar─▒dakilerin fonksiyonel lezzeti:

 def isplitter2(l, n):
    return takewhile(bool,
                     (tuple(islice(start, n))
                            for start in repeat(iter(l))))
 

VEYA:

 def chunks_gen_sentinel(n, seq):
    continuous_slices = imap(islice, repeat(iter(seq)), repeat(0), repeat(n))
    return iter(imap(tuple, continuous_slices).next,())
 

VEYA:

 def chunks_gen_filter(n, seq):
    continuous_slices = imap(islice, repeat(iter(seq)), repeat(0), repeat(n))
    return takewhile(bool,imap(tuple, continuous_slices))
 

7


2010-02-16





Bir ├ž├Âz├╝m daha

 def make_chunks(data, chunk_size): 
    while data:
        chunk, data = data[:chunk_size], data[chunk_size:]
        yield chunk

>>> for chunk in make_chunks([1, 2, 3, 4, 5, 6, 7], 2):
...     print chunk
... 
[1, 2]
[3, 4]
[5, 6]
[7]
>>> 
 

6







 def chunks(iterable,n):
    """assumes n is an integer>0
    """
    iterable=iter(iterable)
    while True:
        result=[]
        for i in range(n):
            try:
                a=next(iterable)
            except StopIteration:
                break
            else:
                result.append(a)
        if result:
            yield result
        else:
            break

g1=(i*i for i in range(10))
g2=chunks(g1,3)
print g2
'<generator object chunks at 0x0337B9B8>'
print list(g2)
'[[0, 1, 4], [9, 16, 25], [36, 49, 64], [81]]'
 

5







Matplotlib.cbook par├žalar─▒n─▒ kullanmay─▒ d├╝┼č├╝n├╝n

├ľrne─čin:

 import matplotlib.cbook as cbook
segments = cbook.pieces(np.arange(20), 3)
for s in segments:
     print s
 

5







Bu referansa bak─▒nhttp://docs.python.org/3.3/library/functions.html%3Fhighlight%3Dzip%23zip#zip

 >>> orange = range(1, 1001)
>>> otuples = list( zip(*[iter(orange)]*10))
>>> print(otuples)
[(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), ... (991, 992, 993, 994, 995, 996, 997, 998, 999, 1000)]
>>> olist = [list(i) for i in otuples]
>>> print(olist)
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ..., [991, 992, 993, 994, 995, 996, 997, 998, 999, 1000]]
>>> 
 

Python3


5


2013-02-18





 a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
CHUNK = 4
[a[i*CHUNK:(i+1)*CHUNK] for i in xrange((len(a) + CHUNK - 1) / CHUNK )]
 

5







Bu noktada, zorunlu anonim-├Âzyinelemeli i┼čleve ihtiyac─▒m─▒z oldu─čunu d├╝┼č├╝n├╝yorum.

 Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))
chunks = Y(lambda f: lambda n: [n[0][:n[1]]] + f((n[0][n[1]:], n[1])) if len(n[0]) > 0 else [])
 

5







Buradaki herkes yineleyiciler hakk─▒nda konu┼čuyor. boltons Bunun i├žin m├╝kemmel bir y├Ântem var iterutils.chunked_iter .

 from boltons import iterutils

list(iterutils.chunked_iter(list(range(50)), 11))
 

Çıktı:

 [[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, 35, 36, 37, 38, 39, 40, 41, 42, 43],
 [44, 45, 46, 47, 48, 49]]
 

Ancak, haf─▒zaya merhamet etmek istemiyorsan─▒z, eski usul├╝ kullanabilir ve dolu olan─▒ list ilk etapta saklayabilirsiniz iterutils.chunked .


5



─░lgili yay─▒nlar


Listeyi LINQ ile Alt Listelere Ay─▒rma

Eclipse IDE'de bir pencereyi / g├Âr├╝n├╝m├╝ nas─▒l b├Âler ve ay─▒r─▒rs─▒n─▒z?

├çok sat─▒rl─▒ bir dizeyi nas─▒l birden ├žok sat─▒ra b├Âlerim?

DataTable'─▒ genel listeye nas─▒l d├Ân├╝┼čt├╝rebilirsiniz?

Git format-patch ile nas─▒l bir yama i├žinde squash yapars─▒n─▒z?

Listeleri C# ile nas─▒l birle┼čtirirsiniz?

FileInputStream'i kullan─▒rken ideal tampon boyutunu nas─▒l belirlersiniz?

Python'da bir dosyay─▒ bir dosyaya nas─▒l okursunuz? [├žift]

Listeyi daha k├╝├ž├╝k listelere b├Âlme (ikiye b├Âl)

Bir "b├╝y├╝k harf" s─▒n─▒rland─▒r─▒lm─▒┼č dizgiyi bir diziye nas─▒l b├Âlebilirsiniz?

Etiketle ilgili di─čer sorular [python]


C++ 11 standart bir bellek modeli tan─▒tt─▒. Bunun anlam─▒ ne? Ve C++ programlamay─▒ nas─▒l etkileyecek?

Ak─▒┼č─▒ bir dosyaya C# ile nas─▒l kaydederim?

Base64 g├Âr├╝nt├╝leri HTMLÔÇÖde nas─▒l g├Âsterilir?

Bir vekt├Âr├╝n belirli bir ├Â─če i├žerip i├žermedi─čini test etme

jQuery kullanarak bir ├Â─čenin t├╝r├╝n├╝ bulma

__Attribute __ ((constructor)) tam olarak nas─▒l ├žal─▒┼č─▒r?

Neden jquery'nin .ajax () y├Ântemi oturum ├žerezimi g├Ândermiyor?

─░ki a├ž─▒k dosyan─▒n (b├Âlmelerdeki) konumlar─▒n─▒ vim'de nas─▒l de─či┼čtirebilirim?

T├╝m ASP.Net web sitelerinin neden yava┼č oldu─čunu ke┼čfettim ve bu konuda ne yapaca─č─▒m─▒ hesaplamaya ├žal─▒┼č─▒yorum

ÔÇťKaynak, dosya sistemiyle senkronize de─čilÔÇŁ durumundan ka├ž─▒nmak