2017-02-03 2 views
-2

Ich habe eine Zuweisung, um einen Wert zu einer sortierten Liste mit Liste Verständnis hinzuzufügen. Ich darf keine Module importieren, nur Verständnis aufzählen, vorzugsweise einen Liner. Ich darf keine Funktionen erstellen und sie auch benutzen. Ich bin völlig im Dunkeln mit diesem Problem. Hoffentlich kann jemand helfen :)Fügen Sie einen Wert in eine sortierte Liste über Liste Verständnis Python

Edit: Ich muss nicht die aktuelle Liste mutieren. In der Tat, ich versuche meine Lösung jetzt mit .pop, ich muss eine neue Liste mit dem Element richtig hinzugefügt, aber ich kann immer noch nicht viel herausfinden.

+0

Dies scheint sehr schlecht durchdacht Zuordnung. List Comprehensions sind funktionale Konstrukte und sollten nicht verwendet werden, um eine bestehende Liste zu mutieren. Sie erstellen * neue Listen * –

+0

Die Zuordnung ist wahrscheinlich, um eine neue Liste mit dem neuen Wert an der richtigen Stelle zu machen. Ich bezweifle, dass sie die ursprüngliche Liste mutieren wollen. Ich vermute, dass ich eine oder mehrere "if" -Klauseln im Listenverständnis verwenden muss. – hpaulj

+0

@ juanpa.arrivillaga ja das ist was sie meinten, tut mir leid, wenn ich es schlecht geschrieben habe. Aber ich kann es immer noch nicht herausfinden. Ich habe versucht, etwas mit knackenden Elementen zu experimentieren, wenn sie kleiner sind als der Wert oder wenn sie größer sind und die Zeit, die der Wert erreicht hat, größer als 1 ist, aber nicht gut funktioniert. –

Antwort

3
try: 
    sorted_a.insert(next(i for i,lhs,rhs in enumerate(zip(sorted_a,sorted_a[1:])) if lhs <= value <= rhs),value) 
except StopIteration: 
    sorted_a.append(value) 

Ich denke, ....

mit Ihrer neuen Problemstellung

[x for x in sorted_a if x <= value] + [value,] + [y for y in sorted_a if y >= value] 

Sie sicherlich die Big-O Komplexität

+1

A + für Sie Herr Joran;) – miradulo

+0

Außer nach dem Entfernen dieses Listenverstehens, weil es nicht notwendig war, Sie nicht mehr Spezifikationen für das OP treffen! – miradulo

+1

Meh ist ein Generator-Verständnis Ich bin sicher, dass sein Lehrer ihm zusätzliche Kredit geben wird, wenn er es erklären kann, P –

1

Für Halbierungs die Liste verbessern könnten, können Sie verwenden bisect.bisect(für andere Leser, die die Antwort in Zukunft beziehen) wie:

>>> from bisect import bisect 

>>> my_list = [2, 4, 6, 9, 10, 15, 18, 20] 
>>> num = 12 

>>> index = bisect(my_list, num) 
>>> my_list[:index]+[num] + my_list[index:] 
[2, 4, 6, 9, 10, 12, 15, 18, 20] 

Aber da Sie nicht Bibliotheken importieren können, können Sie sum und zip mit Liste Verständnis Ausdruck verwenden wie:

>>> my_list = [2, 4, 6, 9, 10, 15, 18, 20] 
>>> num = 12 

>>> sum([[i, num] if i<num<j else [i] for i, j in zip(my_list,my_list[1:])], []) 
[2, 4, 6, 9, 10, 12, 15, 18] 
+1

Ich hätte 'itertools.chain' verwendet, um die Liste zu reduzieren, aber das ist ein importiertes Modul. Die Verwendung von 'sum (alist, [])' zum Flatten ist eine neue Sprache für mich. – hpaulj

+1

@hpaulj 'itertools.chain' ist definitiv ein besserer Weg zur Verkettung. Wie du es richtig vermutet hast; 'sum' wird verwendet, um Importe zu verhindern –

+1

ist es viel langsamer als itertools.chain ... aber es erfüllt die Problemdefinition (auch nach dem Problem bearbeiten ...), also warum meine +1: P –

Verwandte Themen