Ersetzen Sie Werte in der Liste mit Python [duplicate]

Lesezeit: 5 Minuten

Ersetzen Sie Werte in der Liste mit Python duplicate
ja.

Ich habe eine Liste, in der ich Werte durch None ersetzen möchte, wobei condition() True zurückgibt.

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Wenn beispielsweise Bedingungsprüfungen durchgeführt werden, sollte bool(item%2) Folgendes zurückgeben:

[None, 1, None, 3, None, 5, None, 7, None, 9, None]

Was ist der effizienteste Weg, dies zu tun?

  • Verwenden Sie das itertools-Modul, es ist am effizientesten.

    – LtWorf

    29. Januar 16 um 14:38 Uhr

  • Für in-place Ersatzvergleiche, werfen Sie einen Blick auf diese Antwort

    – Lebensbalance

    23. November 16 um 3:12 Uhr


Ersetzen Sie Werte in der Liste mit Python duplicate
John Millikin

Erstellen Sie eine neue Liste mit einem Listenverständnis:

new_items = [x if x % 2 else None for x in items]

Sie können die ursprüngliche Liste direkt ändern, wenn Sie möchten, aber das spart nicht wirklich Zeit:

items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for index, item in enumerate(items):
    if not (item % 2):
        items[index] = None

Hier sind (Python 3.6.3) Timings, die die Nicht-Zeitersparnis demonstrieren:

In [1]: %%timeit
   ...: items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
   ...: for index, item in enumerate(items):
   ...:     if not (item % 2):
   ...:         items[index] = None
   ...:
1.06 µs ± 33.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [2]: %%timeit
   ...: items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
   ...: new_items = [x if x % 2 else None for x in items]
   ...:
891 ns ± 13.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Und Python 2.7.6 Timings:

In [1]: %%timeit
   ...: items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
   ...: for index, item in enumerate(items):
   ...:     if not (item % 2):
   ...:         items[index] = None
   ...: 
1000000 loops, best of 3: 1.27 µs per loop
In [2]: %%timeit
   ...: items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
   ...: new_items = [x if x % 2 else None for x in items]
   ...: 
1000000 loops, best of 3: 1.14 µs per loop

  • ist das am effizientesten? muss enumerate keinen Iterator erstellen und ein Tupel bilden, was Overhead hinzufügt? sind Listen in Python-Arraylisten, die Ihnen ständigen Zugriff ermöglichen?

    – geowa4

    8. Oktober 09 um 20:05 Uhr

  • Ich denke, und ich könnte mich irren, dass er beabsichtigte, eine Kopie der Liste zurückzugeben, anstatt das Original zu ändern. Trotzdem +1 für das Anbieten der effizienten Lösung, wenn Änderungen vor Ort zulässig sind.

    – A. Abgabe

    8. Oktober 09 um 20:07 Uhr

  • @geowa4: Python-“Listen” sind eigentlich Arrays. enumerate() wird einen kleinen Overhead hinzufügen, aber wenn das nicht akzeptabel ist, kann der Index manuell verfolgt werden. @ak: Ich verstehe die Frage nicht. imap() ist kein Vor-Ort-Vorgang.

    – John Millikin

    8. Oktober 2009 um 20:30 Uhr

  • Danke für die Antworten. Aber gibt es hier nicht genug Anwendungsfall für Python-Listen, um eine Ersetzungsmethode zu haben? (ähnlich wie str.replace). Etwas, das die Notwendigkeit dafür vermeidet: def replace(items, a, b): return [b if x == a else x for x in items]

    – Rechnung

    13. September 16 um 17:07 Uhr


  • Ich denke, Sie haben “am einfachsten zu lesen” und “am effizientesten” rückwärts

    – Endolith

    4. März 17 um 23:33 Uhr

ls = [x if (condition) else None for x in ls]

1644075426 521 Ersetzen Sie Werte in der Liste mit Python duplicate
balpha

Hier ist ein anderer Weg:

>>> L = range (11)
>>> map(lambda x: x if x%2 else None, L)
[None, 1, None, 3, None, 5, None, 7, None, 9, None]

  • @gath: Streben Sie nicht danach, Einzeiler für jeden Zweck zu schreiben. Manchmal erhöhen sie die Lesbarkeit oder Leistung, oft jedoch nicht. Zu den Hinweisen: Lernen Sie die Werkzeuge kennen, die Python bietet, insbesondere list (und für Python 3 auch dict) Comprehensions, den ternären Operator, anonyme (Lambda) Funktionen und Funktionen wie map, zip, filter, Reduce, etc.

    – balpha

    9. Oktober 09 um 12:56 Uhr

Riffing auf eine vom OP in einem Kommentar gestellte Nebenfrage, dh:

Was wäre, wenn ich einen Generator hätte, der die Werte aus Bereich (11) anstelle einer Liste liefert. Wäre es möglich, Werte im Generator zu ersetzen?

Sicher, es ist trivial einfach …:

def replaceiniter(it, predicate, replacement=None):
  for item in it:
    if predicate(item): yield replacement
    else: yield item

Übergeben Sie einfach eine Iterable (einschließlich des Ergebnisses des Aufrufs eines Generators) als erstes Argument, das Prädikat, um zu entscheiden, ob ein Wert als zweites Argument ersetzt werden muss, und lassen Sie es rippen.

Beispielsweise:

>>> list(replaceiniter(xrange(11), lambda x: x%2))
[0, None, 2, None, 4, None, 6, None, 8, None, 10]

>>> L = range (11)
>>> [ x if x%2 == 1 else None for x in L ]
[None, 1, None, 3, None, 5, None, 7, None, 9, None]

Falls Sie vorhandene Werte ersetzen möchten, können Sie Ihre ursprüngliche Liste mit Werten aus einem Listenverständnis aktualisieren, indem Sie sie dem gesamten Slice des Originals zuweisen.

data = [*range(11)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
id_before = id(data)
data[:] = [x if x % 2 else None for x in data]
data
# Out: [None, 1, None, 3, None, 5, None, 7, None, 9, None]
id_before == id(data)  # check if list is still the same
# Out: True

Wenn Sie mehrere Namen haben, die auf die ursprüngliche Liste verweisen, haben Sie beispielsweise geschrieben data2=data bevor Sie die Liste ändern und Sie die Slice-Notation für die Zuweisung überspringen data,
data wird erneut gebunden, um auf die neu erstellte Liste zu zeigen, während data2 zeigt immer noch auf die ursprüngliche unveränderte Liste.

data = [*range(11)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
data2 = data
id_before = id(data)
data = [x if x % 2 else None for x in data]  # no [:] here
data
# Out: [None, 1, None, 3, None, 5, None, 7, None, 9, None]
id_before == id(data)  # check if list is still the same
# Out: False
data2
# Out: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Hinweis: Dies ist keine Empfehlung, um generell das eine dem anderen vorzuziehen (Änderung der Liste an Ort und Stelle oder nicht), aber ein Verhalten, auf das Sie achten sollten.

Ersetzen Sie Werte in der Liste mit Python duplicate
Emil

Das könnte helfen…

test_list = [5, 8]
test_list[0] = None
print test_list
#prints [None, 8]

  • Können Sie erklären, warum Sie glauben, dass es helfen könnte?

    – T-Reiher

    14. Januar 17 um 0:48 Uhr

  • @T-Heron Es könnte geändert werden, um zu erfüllen, wonach die Frage verlangt

    – Emil

    15. Januar 17 um 23:24 Uhr

  • Wenn es sein muss geändert, dann ist es keine Antwort auf die gestellte Frage. Bitte nehmen Sie die erforderlichen Änderungen entweder selbst vor (oder erklären Sie sie) oder löschen Sie die Antwort.

    – Cody Grey

    2. August 17 um 9:55 Uhr


  • Dies ist eine harte Codierung, ich glaube nicht, dass dies der beste Weg ist, dies zu tun.

    – Erderschütterer

    29. Juli 19 um 15:04 Uhr

  • Dies ist in einem realen Anwendungsszenario nicht sinnvoll.

    – Misantruppe

    9. Februar 20 um 21:28 Uhr

.

784890cookie-checkErsetzen Sie Werte in der Liste mit Python [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy