Dieser Code nutzt Konzepte unter dieser URL gefunden: Python list comprehension- "pop" result from original list?
ein interessantes Konzept hier, um Ihr Problem gefunden Auftragen, sind die folgenden einige Alternativen zu, was andere haben für diese Frage bisher gepostet. Beide verwenden List Comprehensions und werden kommentiert, um den Zweck der zweiten Option gegenüber der ersten zu erläutern. Haben Sie dieses Experiment für mich als Teil meiner Lernkurve, aber ich hoffe, es kann Ihnen und anderen in diesem Thread auch helfen:
Was ist nett an diesen ist, dass, wenn Ihre Eingabeliste sehr sehr groß ist, Sie nicht haben werden verdoppeln Sie Ihren Speicheraufwand, um die Aufgabe zu erledigen. Sie bauen eine auf, während Sie die andere verkleinern.
Dieser Code wurde auf Python 2.7 und Python 3 getestet.6:
o1 = [1,5,8,-3,6,9,-4,2,-5,6,7,-7, 999, -43, -1, 888]
# modified version of poster's list
o1b = [1,5,8,-3,6,8,-3,2,-4,6,8] # poster's list
o2 = [x for x in (o1.pop() for i in range(len(o1))) \
if (lambda x: True if x < 0 else o1.insert(0, x))(x)]
o2b = [x for x in (o1b.pop() for i in range(len(o1b))) \
if (lambda x: True if x < 0 else o1b.insert(0, x))(x)]
print(o1)
print(o2)
print("")
print(o1b)
print(o2b)
Es erzeugt Ergebnismengen wie folgt (auf ipython Jupyter Notebooks):
[1, 5, 8, 6, 9, 2, 6, 7, 999, 888]
[ 1, 5, 8, 6, 8, 2, 6, 8]
[-4, -3, -3 ]
Hier ist eine andere Version, die auch List Comprehensions als Arbeitspferd verwendet, aber den Code in einer Weise funktionalisiert, die besser lesbar ist (I denke) und einfacher mit verschiedenen numerischen Listen zu testen. Einige werden wahrscheinlich den ursprünglichen Code bevorzugen, da es kürzer ist:
p1 = [1,5,8,-3,6,9,-4,2,-5,6,7,-7, 999, -43, -1, 888]
# modified version of poster's list
p1b = [1,5,8,-3,6,8,-3,2,-4,6,8] # poster's list
def lst_mut_byNeg_mod(x, pLst): # list mutation by neg nums module
# this function only make sense in context of usage in
# split_pos_negs_in_list()
if x < 0: return True
else:
pLst.insert(0,x)
return False
def split_pos_negs_in_list(pLst):
pLngth = len(pLst) # reduces nesting of ((()))
return [x for x in (pLst.pop() for i in range(pLngth)) \
if lst_mut_byNeg_mod(x, pLst)]
p2 = split_pos_negs_in_list(p1)
print(p1)
print(p2)
print("")
p2b = split_pos_negs_in_list(p1b)
print(p1b)
print(p2b)
Final Thoughts: angegebenen Link früher hatte eine Reihe von Ideen in dem Kommentar-Thread:
- Es empfiehlt eine Google-Suche nach dem " Python bloom filter library "- das klingt vielversprechend aus der Sicht der Performance, aber ich habe noch nicht untersucht
- Es gibt einen Beitrag zu diesem Thema mit 554 abgestimmt, und es hat mindestens 4 Kommentare erklären, was möglicherweise fehlerhaft ist damit. Beim Erkunden von Optionen kann es ratsam sein, den Kommentarpfad zu scannen und nicht nur zu überprüfen, was die meisten Stimmen erhält. Für solche Situationen werden viele Optionen vorgeschlagen.
Im nicht sicher, ob ich voll und ganz die zweiten verstehen 'wenn ein:' Aussage – letsc
@letsc - Seit sublist 'a' nur' result' angehängt wird, wenn Sie eine negative Zahl auftreten, Weglassen, dass die zweiten 'wenn ein: 'würde bedeuten, dass positive Zahlen am Ende der Eingabeliste zu 'a' addiert werden, aber 'a' niemals zu 'result' addiert wird. – TigerhawkT3
Oooh !! Fantastisch. Danke vielmals! Ich akzeptiere diese Antwort, da sie als 1. geschrieben wurde und dem Code, den ich bereits habe, am nächsten kommt. Die anderen 2 Antworten funktionieren auch. – letsc