Çok büyük (gigabaytlar) keyfi nesneler verildiğinde (buna ints için benzer bir çözüm gördüm), ya eşdeğerlikle alt listeleri kolayca gruplayabilir miyim? Orijinal listeyi tüketen yerinde veya jeneratör tarafından.Nesnelerin bir listesini devamlılık ile nasıl gruplayabilirim?
l0 = [A,B, A,B,B, A,B,B,B,B, A, A, A,B] #spaces for clarity
İstenilen sonuç:
for g in gen(l0):
print g
....
['A', 'B']
['A', 'B', 'B']
['A', 'B', 'B', 'B', 'B']
....
: Böyle çalışacak bir jeneratör
gen0(l)
olarak yapılabilir
#find boundaries
b0 = []
prev = A
group = A
for idx, elem in enumerate(l0):
if elem == group:
b0.append(idx)
prev = elem
b0.append(len(l0)-1)
for idx, b in enumerate(b0):
try:
c = b0[idx+1]
except:
break
if c == len(l0)-1:
l1.append(l0[b:])
else:
l1.append(l0[b:c])
:
[['A', 'B'], ['A', 'B', 'B'], ['A', 'B', 'B', 'B', 'B'], ['A'], ['A'], ['A', 'B']]
ben şöyle bir döngü versiyonunu yazdı
vb?
DÜZENLEME: Python 2.6 veya 2.7
EDIT kullanarak: Tercih çözüm çoğunlukla kabul Yanıta göre:
def gen_group(f, items):
out = [items[0]]
while items:
for elem in items[1:]:
if f(elem, out[0]):
break
else:
out.append(elem)
for _i in out:
items.pop(0)
yield out
if items:
out = [items[0]]
g = gen_group(lambda x, y: x == y, l0)
for out in g:
print out
Bu yüzden bir listeyi alt listelere ayırmak istersiniz, böylece her alt liste ilk öğe olarak "A" ile başlar ve yalnızca bu tek "A" öğesini içerir? –
Hayır, her bir alt listenin sadece ilk A olmasını ve daha sonra birçok B'nin gelmesini istiyorum. – jambox
Listenin "A" ile başlaması güvenli bir varsayım mıdır? –