from copy import deepcopy
# Listen
l = ["python", 42,18, 4, 2, 19]
print(l[0])
print(l[2:4])  # inklusive:exklusive
print(len(l))
for i in range(len(l)):
    print(i, l[i])
l2 = [[1, 2, 3], [10, 11, 12]]
print(l2)
print(l2[0])
print(l2[0][1])
# kopien von veschachtelten strukturen
l_copy = l2.copy()
l_copy[0][0] = 10
print(l2)
# was ist eine Liste
#  sammlung an verweise


l2 = [[1, 2, 3], [10, 11, 12]]
print(l2)
print(l2[0])
print(l2[0][1])
# kopien von veschachtelten strukturen
l_copy = deepcopy(l2)
l_copy[0][0] = 10
print(l2)
# python ist objektorientiert aufgebaut

# Dictionaries (ungeordnete Datenstruktur)
prices = {"bananas": 2.19, "oranges": 3.39, "ice-cream": 2.79, 0:"zero"}
print(prices["oranges"])
print(len(prices))
print(prices)
print(prices[0])
# hinzufügen von schlüsselwertpaaren
prices["ice-tea"] = 0.99
print(prices)
prices["bananas"] = 2.49  # update den wert
print(prices["bananas"])
print(prices)
prices.pop(0)
print(prices)
# über ein dictionary iterieren
for product in prices:  # über die schlüssel
    print(f"{product:10s} {prices[product]:7.2f}")

print()
for product, price in prices.items():
    print(f"{product:10s} {price:7.2f}")
    reduced_price = price * 0.9

product_names = ["bananas", "oranges", "ice-cream", "ice_tea"]
# gibt es ein element in einer Liste bzw. einen Schlüssel in einem dictionary
# in bei listen ist eine for-schleife (lineare Laufzeit)
if "coffee" in product_names:
    print("Coffee available")
else:
    print("Coffee not available")

# in bei dict: konstante Zeit
if "coffee" in prices:  # überprüft nur schlüssel
    print("Coffee available")
else:
    print("Coffee not available")

# oder set (merkt sich nicht die reihenfolge des einfügens)

# schlüssel im dictionary:
#  1. unveränderlich
#  2. hashable