Wie man eine Python-Liste in ein Set umwandelt und dabei die ursprüngliche Reihenfolge beibehält

PythonBeginner
Jetzt üben

Einführung

Pythons integrierte Datenstrukturen bieten flexible Möglichkeiten zur Verwaltung und Manipulation von Daten. In diesem Tutorial werden wir untersuchen, wie man eine Python-Liste in ein Set umwandelt und dabei die ursprüngliche Reihenfolge der Elemente beibehält. Diese Technik ist besonders nützlich, wenn Sie Duplikate aus einer Liste entfernen, aber die Reihenfolge des ersten Auftretens jedes eindeutigen Elements beibehalten müssen.

Am Ende dieses Tutorials werden Sie die Unterschiede zwischen Listen und Sets in Python verstehen und mehrere Techniken erlernen, um eine Liste in ein Set umzuwandeln und gleichzeitig die ursprüngliche Reihenfolge der Elemente beizubehalten.

Listen und Sets in Python verstehen

Bevor wir uns mit der Umwandlung von Listen in Sets befassen, wollen wir die grundlegenden Eigenschaften dieser beiden Datenstrukturen in Python verstehen.

Python-Listen

Listen in Python sind geordnete Sammlungen, die Elemente verschiedener Datentypen speichern können. Sie erlauben doppelte Werte und behalten die Einfüge Reihenfolge der Elemente bei.

Erstellen wir eine einfache Python-Datei, um Listen zu demonstrieren. Öffnen Sie den Code-Editor und erstellen Sie eine neue Datei mit dem Namen list_demo.py im Verzeichnis /home/labex/project:

## Listen in Python
my_list = [1, 2, 3, 2, 4, 5, 3]

print("Original list:", my_list)
print("Length of list:", len(my_list))
print("First element:", my_list[0])
print("Last element:", my_list[-1])
print("First 3 elements:", my_list[:3])
print("Does list contain duplicates?", len(my_list) != len(set(my_list)))

Führen Sie diese Datei nun im Terminal aus:

python3 list_demo.py

Sie sollten eine Ausgabe ähnlich dieser sehen:

Original list: [1, 2, 3, 2, 4, 5, 3]
Length of list: 7
First element: 1
Last element: 3
First 3 elements: [1, 2, 3]
Does list contain duplicates? True

Python-Sets

Sets sind ungeordnete Sammlungen eindeutiger Elemente. Wenn Sie eine Liste in ein Set umwandeln, werden doppelte Elemente automatisch entfernt, aber die ursprüngliche Reihenfolge wird nicht beibehalten.

Erstellen wir eine weitere Datei namens set_demo.py, um Sets zu untersuchen:

## Sets in Python
my_list = [1, 2, 3, 2, 4, 5, 3]
my_set = set(my_list)

print("Original list:", my_list)
print("Converted to set:", my_set)
print("Length of list:", len(my_list))
print("Length of set:", len(my_set))
print("Does set maintain order?", list(my_set) == [1, 2, 3, 4, 5])

Führen Sie diese Datei aus:

python3 set_demo.py

Die Ausgabe zeigt:

Original list: [1, 2, 3, 2, 4, 5, 3]
Converted to set: {1, 2, 3, 4, 5}
Length of list: 7
Length of set: 5
Does set maintain order? False

Beachten Sie, dass das Set alle Duplikate entfernt hat, aber die Reihenfolge möglicherweise von der ursprünglichen Liste abweicht. Dies liegt daran, dass Sets in Python von Natur aus ungeordnet sind.

Grundlegender Ansatz: Konvertieren einer Liste in ein Set

Nachdem wir die Unterschiede zwischen Listen und Sets verstanden haben, wollen wir untersuchen, wie man eine Liste in ein Set umwandelt und welche Auswirkungen diese Konvertierung hat.

Einfache Konvertierung

Der einfachste Weg, eine Liste in ein Set umzuwandeln, ist die Verwendung der integrierten set()-Funktion. Erstellen Sie eine neue Datei mit dem Namen basic_conversion.py:

## Einfache Konvertierung von Liste in Set
fruits = ["apple", "banana", "orange", "apple", "pear", "banana"]

## Konvertiere Liste in Set (entfernt Duplikate, aber verliert die Reihenfolge)
unique_fruits = set(fruits)

print("Original list:", fruits)
print("As a set:", unique_fruits)

## Zurück in eine Liste konvertieren (Reihenfolge nicht beibehalten)
unique_fruits_list = list(unique_fruits)
print("Back to list:", unique_fruits_list)

Führen Sie diese Datei aus:

python3 basic_conversion.py

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Original list: ['apple', 'banana', 'orange', 'apple', 'pear', 'banana']
As a set: {'orange', 'banana', 'apple', 'pear'}
Back to list: ['orange', 'banana', 'apple', 'pear']

Beachten Sie, dass das Set alle Duplikate entfernt hat, aber die Reihenfolge von der ursprünglichen Liste abweicht. Wenn wir das Set wieder in eine Liste konvertieren, ist die Reihenfolge immer noch nicht die gleiche wie in unserer ursprünglichen Liste.

Das Problem mit der Reihenfolge

Diese einfache Konvertierung zeigt das Problem, das wir lösen wollen: Wenn wir eine Liste in ein Set konvertieren, verlieren wir die ursprüngliche Reihenfolge der Elemente. Wenn die ursprüngliche Reihenfolge wichtig ist, ist dieser Ansatz nicht geeignet.

Ändern wir unser Beispiel, um zu zeigen, warum dies ein Problem sein könnte. Erstellen Sie eine Datei mit dem Namen order_matters.py:

## Beispiel, das zeigt, warum die Reihenfolge wichtig ist
steps = ["Preheat oven", "Mix ingredients", "Pour batter", "Bake", "Mix ingredients"]

## Entferne Duplikate mit Set
unique_steps = list(set(steps))

print("Original cooking steps:", steps)
print("Unique steps (using set):", unique_steps)
print("Is the order preserved?", unique_steps == ["Preheat oven", "Mix ingredients", "Pour batter", "Bake"])

Führen Sie die Datei aus:

python3 order_matters.py

Die Ausgabe lautet:

Original cooking steps: ['Preheat oven', 'Mix ingredients', 'Pour batter', 'Bake', 'Mix ingredients']
Unique steps (using set): ['Preheat oven', 'Bake', 'Mix ingredients', 'Pour batter']
Is the order preserved? False

In diesem Beispiel ist die Reihenfolge der Kochschritte entscheidend. Wenn Sie backen, bevor Sie die Zutaten mischen, wird das Ergebnis katastrophal sein. Dies veranschaulicht, warum wir eine Möglichkeit benötigen, die ursprüngliche Reihenfolge beizubehalten, wenn wir Duplikate entfernen.

Reihenfolge beim Konvertieren einer Liste in ein Set beibehalten

Nachdem wir das Problem verstanden haben, wollen wir Methoden untersuchen, um eine Liste in ein Set umzuwandeln und dabei die ursprüngliche Reihenfolge der Elemente beizubehalten.

Methode 1: Verwendung eines Dictionarys zur Beibehaltung der Reihenfolge

Ein Ansatz ist die Verwendung eines Dictionarys, um die Reihenfolge der Elemente zu verfolgen. Seit Python 3.7 behalten Dictionarys standardmäßig die Einfüge Reihenfolge bei.

Erstellen Sie eine neue Datei mit dem Namen dict_approach.py:

## Verwendung eines Dictionarys zur Beibehaltung der Reihenfolge
fruits = ["apple", "banana", "orange", "apple", "pear", "banana"]

## Erstelle ein Dictionary mit Listenelementen als Keys
## Dies entfernt automatisch Duplikate und behält die Reihenfolge bei
unique_fruits_dict = dict.fromkeys(fruits)

## Konvertiere Dictionary-Keys zurück in eine Liste
unique_fruits = list(unique_fruits_dict)

print("Original list:", fruits)
print("Unique elements (order preserved):", unique_fruits)

Führen Sie die Datei aus:

python3 dict_approach.py

Sie sollten Folgendes sehen:

Original list: ['apple', 'banana', 'orange', 'apple', 'pear', 'banana']
Unique elements (order preserved): ['apple', 'banana', 'orange', 'pear']

Beachten Sie, dass die Reihenfolge des ersten Auftretens jedes Elements beibehalten wird.

Methode 2: Verwendung von OrderedDict

Für Benutzer von Python-Versionen vor 3.7 oder um die Absicht expliziter zu machen, können wir OrderedDict aus dem collections-Modul verwenden.

Erstellen Sie eine neue Datei mit dem Namen ordered_dict_approach.py:

## Verwendung von OrderedDict zur Beibehaltung der Reihenfolge
from collections import OrderedDict

fruits = ["apple", "banana", "orange", "apple", "pear", "banana"]

## Erstelle ein OrderedDict mit Listenelementen als Keys
## Dies entfernt automatisch Duplikate und behält die Reihenfolge bei
unique_fruits_ordered = list(OrderedDict.fromkeys(fruits))

print("Original list:", fruits)
print("Unique elements (order preserved):", unique_fruits_ordered)

Führen Sie die Datei aus:

python3 ordered_dict_approach.py

Die Ausgabe sollte sein:

Original list: ['apple', 'banana', 'orange', 'apple', 'pear', 'banana']
Unique elements (order preserved): ['apple', 'banana', 'orange', 'pear']

Methode 3: Verwendung einer Schleife und eines Sets zur Überprüfung

Ein weiterer Ansatz ist die Verwendung einer Schleife und eines Sets, um zu überprüfen, ob wir ein Element bereits gesehen haben.

Erstellen Sie eine neue Datei mit dem Namen loop_approach.py:

## Verwendung einer Schleife und eines Sets zur Beibehaltung der Reihenfolge
fruits = ["apple", "banana", "orange", "apple", "pear", "banana"]

unique_fruits = []
seen = set()

for fruit in fruits:
    if fruit not in seen:
        seen.add(fruit)
        unique_fruits.append(fruit)

print("Original list:", fruits)
print("Unique elements (order preserved):", unique_fruits)

Führen Sie die Datei aus:

python3 loop_approach.py

Die Ausgabe sollte sein:

Original list: ['apple', 'banana', 'orange', 'apple', 'pear', 'banana']
Unique elements (order preserved): ['apple', 'banana', 'orange', 'pear']

Alle drei Methoden erzielen das gleiche Ergebnis: Entfernen von Duplikaten unter Beibehaltung der Reihenfolge des ersten Auftretens jedes Elements.

Praktisches Beispiel: Analyse von Textdaten

Wenden wir das Gelernte auf ein reales Beispiel an: die Analyse der Worthäufigkeit in einem Text unter Beibehaltung der Reihenfolge des ersten Auftretens.

Erstellen eines Textanalyse-Tools

Erstellen Sie eine neue Datei mit dem Namen text_analyzer.py:

def analyze_text(text):
    """
    Analysiere Text, um eindeutige Wörter in der Reihenfolge ihres ersten Auftretens
    und ihre Häufigkeiten zu finden.
    """
    ## Teile den Text in Wörter auf und konvertiere sie in Kleinbuchstaben
    words = text.lower().split()

    ## Entferne Satzzeichen aus Wörtern
    clean_words = [word.strip('.,!?:;()[]{}""\'') for word in words]

    ## Zähle die Häufigkeit unter Beibehaltung der Reihenfolge
    word_counts = {}
    unique_words_in_order = []

    for word in clean_words:
        if word and word not in word_counts:
            unique_words_in_order.append(word)
        word_counts[word] = word_counts.get(word, 0) + 1

    return unique_words_in_order, word_counts

## Beispieltext
sample_text = """
Python is amazing. Python is also easy to learn.
With Python, you can create web applications, data analysis tools,
machine learning models, and much more. Python has many libraries
that make development faster. Python is versatile!
"""

## Analysiere den Text
unique_words, word_frequencies = analyze_text(sample_text)

## Gib die Ergebnisse aus
print("Text sample:")
print(sample_text)
print("\nUnique words in order of first appearance:")
print(unique_words)
print("\nWord frequencies:")
for word in unique_words:
    if word:  ## Überspringe leere Strings
        print(f"'{word}': {word_frequencies[word]} times")

Führen Sie die Datei aus:

python3 text_analyzer.py

Die Ausgabe zeigt die eindeutigen Wörter in der Reihenfolge ihres ersten Auftretens zusammen mit ihren Häufigkeiten:

Text sample:

Python is amazing. Python is also easy to learn.
With Python, you can create web applications, data analysis tools,
machine learning models, and much more. Python has many libraries
that make development faster. Python is versatile!

Unique words in order of first appearance:
['python', 'is', 'amazing', 'also', 'easy', 'to', 'learn', 'with', 'you', 'can', 'create', 'web', 'applications', 'data', 'analysis', 'tools', 'machine', 'learning', 'models', 'and', 'much', 'more', 'has', 'many', 'libraries', 'that', 'make', 'development', 'faster', 'versatile']

Word frequencies:
'python': 5 times
'is': 3 times
'amazing': 1 times
'also': 1 times
...

Verbesserung des Tools

Verbessern wir unseren Textanalysator, um komplexere Szenarien zu bewältigen. Erstellen Sie eine Datei mit dem Namen improved_analyzer.py:

from collections import OrderedDict

def analyze_text_improved(text):
    """
    Eine verbesserte Version des Textanalysators, die komplexere Szenarien behandelt
    und mehr Statistiken liefert.
    """
    ## Teile den Text in Wörter auf und konvertiere sie in Kleinbuchstaben
    words = text.lower().split()

    ## Entferne Satzzeichen aus Wörtern
    clean_words = [word.strip('.,!?:;()[]{}""\'') for word in words]

    ## Verwende OrderedDict, um die Reihenfolge beizubehalten und die Häufigkeit zu zählen
    word_counts = OrderedDict()

    for word in clean_words:
        if word:  ## Überspringe leere Strings
            word_counts[word] = word_counts.get(word, 0) + 1

    ## Hole Statistiken
    total_words = sum(word_counts.values())
    unique_words_count = len(word_counts)

    return list(word_counts.keys()), word_counts, total_words, unique_words_count

## Beispieltext
sample_text = """
Python is amazing. Python is also easy to learn.
With Python, you can create web applications, data analysis tools,
machine learning models, and much more. Python has many libraries
that make development faster. Python is versatile!
"""

## Analysiere den Text
unique_words, word_frequencies, total_count, unique_count = analyze_text_improved(sample_text)

## Gib die Ergebnisse aus
print("Text sample:")
print(sample_text)
print("\nStatistics:")
print(f"Total words: {total_count}")
print(f"Unique words: {unique_count}")
print(f"Uniqueness ratio: {unique_count/total_count:.2%}")

print("\nTop 5 most frequent words:")
sorted_words = sorted(word_frequencies.items(), key=lambda x: x[1], reverse=True)
for word, count in sorted_words[:5]:
    print(f"'{word}': {count} times")

Führen Sie die Datei aus:

python3 improved_analyzer.py

Sie sollten eine Ausgabe mit zusätzlichen Statistiken sehen:

Text sample:

Python is amazing. Python is also easy to learn.
With Python, you can create web applications, data analysis tools,
machine learning models, and much more. Python has many libraries
that make development faster. Python is versatile!

Statistics:
Total words: 38
Unique words: 30
Uniqueness ratio: 78.95%

Top 5 most frequent words:
'python': 5 times
'is': 3 times
'to': 1 times
'learn': 1 times
'with': 1 times

Dieses praktische Beispiel zeigt, wie die Beibehaltung der Reihenfolge von Elementen beim Entfernen von Duplikaten in realen Anwendungen wie der Textanalyse nützlich sein kann.

Leistungsvergleich und Best Practices

Nachdem wir verschiedene Methoden zur Konvertierung einer Liste in ein Set unter Beibehaltung der Reihenfolge untersucht haben, wollen wir ihre Leistung vergleichen und einige Best Practices festlegen.

Erstellen eines Leistungstests

Erstellen Sie eine neue Datei mit dem Namen performance_test.py:

import time
from collections import OrderedDict

def method1_dict(data):
    """Using dict.fromkeys()"""
    return list(dict.fromkeys(data))

def method2_ordereddict(data):
    """Using OrderedDict.fromkeys()"""
    return list(OrderedDict.fromkeys(data))

def method3_loop(data):
    """Using a loop and a set"""
    result = []
    seen = set()
    for item in data:
        if item not in seen:
            seen.add(item)
            result.append(item)
    return result

def time_function(func, data, runs=100):
    """Measure execution time of a function"""
    start_time = time.time()
    for _ in range(runs):
        func(data)
    end_time = time.time()
    return (end_time - start_time) / runs

## Test data
small_list = list(range(100)) + list(range(50))  ## 150 items, 50 duplicates
medium_list = list(range(1000)) + list(range(500))  ## 1500 items, 500 duplicates
large_list = list(range(10000)) + list(range(5000))  ## 15000 items, 5000 duplicates

## Test results
print("Performance comparison (average time in seconds over 100 runs):\n")

print("Small list (150 items, 50 duplicates):")
print(f"dict.fromkeys():       {time_function(method1_dict, small_list):.8f}")
print(f"OrderedDict.fromkeys(): {time_function(method2_ordereddict, small_list):.8f}")
print(f"Loop and set:          {time_function(method3_loop, small_list):.8f}")

print("\nMedium list (1,500 items, 500 duplicates):")
print(f"dict.fromkeys():       {time_function(method1_dict, medium_list):.8f}")
print(f"OrderedDict.fromkeys(): {time_function(method2_ordereddict, medium_list):.8f}")
print(f"Loop and set:          {time_function(method3_loop, medium_list):.8f}")

print("\nLarge list (15,000 items, 5,000 duplicates):")
print(f"dict.fromkeys():       {time_function(method1_dict, large_list):.8f}")
print(f"OrderedDict.fromkeys(): {time_function(method2_ordereddict, large_list):.8f}")
print(f"Loop and set:          {time_function(method3_loop, large_list):.8f}")

Führen Sie den Leistungstest aus:

python3 performance_test.py

Die Ausgabe zeigt die Leistung jeder Methode mit unterschiedlichen Listengrößen:

Performance comparison (average time in seconds over 100 runs):

Small list (150 items, 50 duplicates):
dict.fromkeys():       0.00000334
OrderedDict.fromkeys(): 0.00000453
Loop and set:          0.00000721

Medium list (1,500 items, 500 duplicates):
dict.fromkeys():       0.00003142
OrderedDict.fromkeys(): 0.00004123
Loop and set:          0.00007621

Large list (15,000 items, 5,000 duplicates):
dict.fromkeys():       0.00035210
OrderedDict.fromkeys(): 0.00044567
Loop and set:          0.00081245

Die tatsächlichen Zahlen können je nach Ihrem System variieren, aber Sie sollten einige Muster erkennen.

Best Practices

Basierend auf unseren Experimenten wollen wir einige Best Practices festlegen. Erstellen Sie eine Datei mit dem Namen best_practices.py:

"""
Best Practices for Converting a List to a Set While Preserving Order
"""

## Example 1: For Python 3.7+, use dict.fromkeys() for best performance
def preserve_order_modern(lst):
    """Best method for Python 3.7+ - using dict.fromkeys()"""
    return list(dict.fromkeys(lst))

## Example 2: For compatibility with older Python versions, use OrderedDict
from collections import OrderedDict

def preserve_order_compatible(lst):
    """Compatible method for all Python versions - using OrderedDict"""
    return list(OrderedDict.fromkeys(lst))

## Example 3: When you need to process elements while preserving order
def preserve_order_with_processing(lst):
    """Process elements while preserving order"""
    result = []
    seen = set()

    for item in lst:
        ## Option to process the item here
        processed_item = str(item).lower()  ## Example processing

        if processed_item not in seen:
            seen.add(processed_item)
            result.append(item)  ## Keep original item in the result

    return result

## Demo
data = ["Apple", "banana", "Orange", "apple", "Pear", "BANANA"]

print("Original list:", data)
print("Method 1 (Python 3.7+):", preserve_order_modern(data))
print("Method 2 (Compatible):", preserve_order_compatible(data))
print("Method 3 (With processing):", preserve_order_with_processing(data))

Führen Sie die Datei aus:

python3 best_practices.py

Die Ausgabe zeigt, wie jede Methode die Daten verarbeitet:

Original list: ['Apple', 'banana', 'Orange', 'apple', 'Pear', 'BANANA']
Method 1 (Python 3.7+): ['Apple', 'banana', 'Orange', 'apple', 'Pear', 'BANANA']
Method 2 (Compatible): ['Apple', 'banana', 'Orange', 'apple', 'Pear', 'BANANA']
Method 3 (With processing): ['Apple', 'Orange', 'Pear']

Beachten Sie, dass Methode 3 "Apple" und "apple" aufgrund der Kleinbuchstabenverarbeitung als dasselbe Element betrachtet.

Empfehlungen

Basierend auf unseren Experimenten sind hier einige Empfehlungen:

  1. Für Python 3.7 und höher verwenden Sie dict.fromkeys() für die beste Leistung.
  2. Für Kompatibilität mit allen Python-Versionen verwenden Sie OrderedDict.fromkeys().
  3. Wenn Sie eine benutzerdefinierte Verarbeitung durchführen müssen, während Sie nach Duplikaten suchen, verwenden Sie den Schleifen- und Set-Ansatz.
  4. Berücksichtigen Sie die Groß-/Kleinschreibung und andere Transformationen basierend auf Ihren spezifischen Anforderungen.

Zusammenfassung

In diesem Tutorial haben Sie Folgendes gelernt:

  1. Die grundlegenden Unterschiede zwischen Python-Listen und -Sets

  2. Warum die Konvertierung einer Liste in ein Set normalerweise dazu führt, dass die Reihenfolge verloren geht

  3. Mehrere Methoden, um eine Liste in ein Set zu konvertieren und dabei die ursprüngliche Reihenfolge beizubehalten:

    • Verwendung von dict.fromkeys() in Python 3.7+
    • Verwendung von OrderedDict.fromkeys() für die Kompatibilität mit älteren Python-Versionen
    • Verwendung einer Schleife mit einem Set für komplexere Verarbeitungen
  4. Wie man diese Techniken auf reale Probleme wie die Textanalyse anwendet

  5. Leistungsaspekte und Best Practices für verschiedene Szenarien

Diese Techniken sind wertvoll für die Datenbereinigung, das Entfernen von Duplikaten aus Benutzereingaben, die Verarbeitung von Konfigurationsoptionen und viele andere gängige Programmieraufgaben. Durch die Auswahl des richtigen Ansatzes basierend auf Ihren spezifischen Anforderungen können Sie saubereren und effizienteren Python-Code schreiben.