Gibt es eine Möglichkeit, Liste nach Prädikat an Ort und Stelle mit Standard-Python 2.7 (C++ STL std :: Partitionsstil) zu partitionieren? So etwas wie group_by
von itertools
, aber ohne zusätzliche Arrays zu killen? Ich muss Array rekursiv in zwei Gruppen basierend auf variadischen Bedingungen partitionieren und ich bin durch die Menge an RAM begrenzt.Python - vor Ort Liste Partition
Was ich suche, ist eine Funktion wie:
partitionCPPStyle(data, startIndex, endIndex, condition)
, die in data[startIndex:endIndex]
Liste führen würde, alle Elemente, die die Bedingung am Anfang genügen, und den Index des ersten Elements zurückkehrt, die nicht fullfil nicht die Bedingung. Keine Kopien, so wenig zusätzlicher Speicher wie möglich.
Ich habe meine eigene Implementierung endete schreiben:
def partitionInPlace(data, startIndex, endIndex, predicate):
swapIndex = endIndex
index = startIndex
while(index < swapIndex):
if not predicate(data[index]):
temp = data[swapIndex]
data[swapIndex] = data[index]
data[index] = temp
swapIndex = swapIndex-1
else:
index = index+1
return index
Gibt es eine effizientere Art und Weise, es zu tun?
Die Iterator-Tools werden die Liste nicht kopieren oder bin ich völlig falsch? Aber wenn Sie planen, Elemente in einer Liste zu löschen, müssen Sie eine neue Liste erstellen, einige, wie das Sehen als Liste unveränderlich ist und nicht geändert werden kann. Vielleicht werfen Sie einen Blick auf 'dicts' oder [ctype.array] (https://docs.python.org/2/library/ctypes.html#arrays) s - vielleicht können Sie etwas damit machen? – Torxed
@Torxed-Listen sind änderbar. – roganjosh
@roganjosh Es tut mir leid, du hast Recht. Ich habe Listen mit 'Tupel' in meinem Kopf gemischt. – Torxed