非常に大きい(ギガバイト)任意のオブジェクトのリストが与えられています(私はこれと同じような解決法をintに見ました)、等価でサブリストに簡単にグループ化できますか?インプレースまたは元のリストを消費するジェネレータのいずれか。どのようにオブジェクトのリストを連続性でグループ化できますか?
l0 = [A,B, A,B,B, A,B,B,B,B, A, A, A,B] #spaces for clarity
望ましい結果は:
for g in gen(l0):
print g
....
['A', 'B']
['A', 'B', 'B']
['A', 'B', 'B', 'B', 'B']
....
:これは同じように動作しますジェネレータ
gen0(l)
として行うことができます
#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']]
は、私はそうのようなループバージョンを書きました
など?
EDIT:パイソン2.6または2.7
EDITを使用して:好適な溶液、ほとんど受け入れ答えに基づく:
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
したがって、各サブリストが最初の要素として "A"で始まり、この単一の "A"要素のみを含むようにリストをサブリストに分割しますか? –
いいえ、それぞれのサブリストには最初のAだけが必要ですが、後には多くのBが必要です。 – jambox
リストが「A」で始まることは安全な仮定ですか? –