Dodanie danych do kilku list na raz

0

Witam wszystkich,

Importuje dane z pliku excela.
W liście "zsp" - posiadam 20 elementów.
Liczba elementów na tej liczbie może być zmienna w zależności od wyboru jaki plik excela zaimportuje ,więc 20 nie jest stałe.

Kolejna lista to "drstrzelone" i "drstracone".

W jednej i drugiej liście są dane liczbowe dla 20 elementów ,które znajduję się na liście "zsp"

Dla elementów z listy zsp potrzebuję utworzyć 20 list do przechowania danych z listy "drstrzelone" i kolejne 20 dla danych z listy "drstracone".

Kolejne 20 list będzie zawierać pkt zdobyte dla każdego zespołu wg obliczenia listy "drstrzelone" i "drstracone"

zsp=[] #,moje pobrane 20 drużyn
drstrzelone = [] #lista z golami strzelonymi
drstracone =[] #lista z golami straconymi

d1p= [] #lista dla zsp[0] pierwszej drużyny z golami strzelonymi
d1m=[] #lista dla zsp[0] pierwszej drużyny z golami straconymi
d1pkt=[] #lista dla zsp[0] pierwszej drużyny z punktani
for i,r in enumerate(zsp):
    if r==zsp[0]:
        d1p.append(drstrzelone[i])
        d1m.append(drstracone[i])

Aby dodać dane dla 1 drużyny utworzyłem taki kod i rozszerzam go poprzez "elif" dla kolejnych zmiennych. do "d20p ,d20m i d20pkt.""
Dla wyliczenia punktów dla drużyny skorzystałem z takiego rozwiązania:

for i,r in enumerate(d1p):
    if r > d1m[i]:
        d1pkt.append(3)
    elif r < d1m[i]:
        d1pkt.append(0)
    elif r == d1m[i]:
        d1pkt.append(1)

Jeśli w kodzie umieszczę "elif" dla przypuśćmy 20 zmiennych ,a podczas pobierania innego pliku excela lista "zsp" będzie zawierała tylko 18 zespołów to otrzymam błąd .
Czy można temu jakoś zapobiec ,aby jakoś to uwarunkować ,że lista pobieranych jest zależna od ilość elementów w "zsp"?
Czy można uprościć kod ,aby pobierać do zmiennych dane bez 20 elifów?
Czy jest jeszcze jakiś sposób na tworzenie dynamiczne zmiennych np wg iteracji?
Składnia nie jest pewnie "pythonowa" ,ale proszę o wyrozumiałość moja przygoda z tym językiem trwa 3 tydzień .

Pozdrawiam

4

Zrób słownik list na przykład:

zespoły = ["abc", "def", "ghi"]
gole_stracone = {zespół: [] for zespół in zespoły}
print(gole_stracone)  # {'abc': [], 'def': [], 'ghi': []}
gole_stracone["def"].append("cokolwiek")
print(gole_stracone)  # {'abc': [], 'def': ["cokolwiek"], 'ghi': []}

Albo w ogóle miej słownik słowników, czy coś normalniejszego do tego, w zależności od potrzeb.

3

@Konrado777:

Dlaczego mi się wydaje, że lekarstwem dla ciebie jest nie kilka list na typie prostym (liczbowym)
a jedna lista na typie złożonym ?
Takie mam wrażenie, że dlatego kopiesz się zaspą ...

class Zespół:
    def __init__(self, naz):
       self.stracone = 0
       self. strzelone = 0
       self.nazwa = naz

 ...

 wis = Zespół('Wisła') 
 wis.stzrelone = 11
..

 zep = Zespół('Inny') 
 zesp.strzelone = 7
..

lista.append(wis) 
lista.appned(zez) 
49

@ZrobieDobrze: Dobrze radzi. Wsadzenie tego w obiekty wydaje się sensowniejsze a na pewno ułatwi Ci dalszą pracę.
Zamiast bawić się w ifologie, możesz np stworzyć dodatkową klasę typu manager, gdzie raz określisz logikę, którą potem sobie reużyjesz. Na dolę podaje przykład jak mogło by to wyglądać. W tym przypadku użyłem mapy do przetrzymywania zespołów zamiast listy. Zamiast bazować na indexie, bazujesz na kluczu którym jest nazwa teamu + mapa jest zdecydowanie szybsza w przypadku większej ilości drużyn. Dopisujesz sobie kolejne metody co do uznania i to wszystko.

from dataclasses import dataclass
from collections import UserDict
from typing import List, Generator, Dict

mocked_input = [
    {"name": "Lech", "scored_goals": 2, "lost_goals": 1},
    {"name": "Legia", "scored_goals": 3, "lost_goals": 2},
]


@dataclass
class Team:
    name: str
    scored_goals: int
    lost_goals: int


class TeamsManager(UserDict):
    def __init__(self):
        super().__init__()

    def add_team(self, team: Team):
        super(TeamsManager, self).__setitem__(team.name, team)

    def add_teams(self, teams: List[Team] or Generator[Team]):
        for team in teams:
            super(TeamsManager, self).__setitem__(team.name, team)

    def get_team(self, team_name: str) -> Team:
        return super(TeamsManager, self).__getitem__(team_name)

    @property
    def all_teams(self) -> Dict[str, Team]:
        return self.data


def main(manager: TeamsManager):
    teams: Generator[Team] = (Team(**team) for team in mocked_input)

    manager.add_teams(teams)

    print(manager.all_teams)


if __name__ == "__main__":
    manager: TeamsManager = TeamsManager()
    main(manager=manager)
0

@ZrobieDobrze

Witaj
Dzięki za pomoc z tym słownikiem.
Mam pytanie ,a nie chcę zakładać nowego tematu na forum.

Zakładam ,że mam jakieś 2 listy "liga1" i "liga2" i chcę dodać do nich jakieś dane w jakiejś pętli.
Czy podczas wpisywania "liga1.append("cokolwiek")"" można połączyć ze stringów nazwę listy ?

Chodzi o coś takiego "liga"+"1".append("cokolwiek").
Bardzo mnie to ciekawi czy jest jakiś sposób ,aby utworzyć nazwę listy ,która jest ,ale chce ją wywołać za pomocą dodania wyrazów?

Pytam o to ,bo w excelu dość często korzystałem z funkcji adres.pośredni gdzie nazwa pisana mogła być zdefiniowana jako adres arkusza czy komórek.

Pozdrawiam

2
Konrado777 napisał(a):

@ZrobieDobrze

Witaj
Dzięki za pomoc z tym słownikiem.

Nie, ja ci nie pomogłem ze słownikiem
Jak ci zaproponowałem klasę

Chodzi o coś takiego "liga"+"1".append("cokolwiek").> Bardzo mnie to ciekawi czy jest jakiś sposób ,aby utworzyć nazwę listy ,która jest ,ale chce ją wywołać za pomocą dodania wyrazów?

A teraz to pytasz o słownik.

Praktycznie zawsze jak ktoś mysli "chciałbym dynamiczną nazwę zmiennej", to w praktyce mysli o słowniku. ALE nie w sensie dosłownym - pożądany skutek, ale nieco inny zrobienia kodu i struktur danych

Sorry, to już taki moment, ze nie postąpisz bez dokumentacji
https://docs.python.org/3.11/tutorial/datastructures.html?highlight=dictionary

1

https://www.google.com/search?client=firefox-b-d&q=python+dictionary+tutorial

i druga pozycja wyjaśnia wszystko

https://realpython.com/python-dicts/

,nie ma nic o przypisywaniu do list czy słowników

Oczywiście.
Bo lista to taki sam obiekty pythonowy, jak inne. Programowanie jest PEŁNE abstrakcji, uogólnień. Bez tego nie ruszysz. wstawienie listy jako elementu w słowniku nie rózni sie niczym, od wstawienia innego obiektu.
Tak jakbyś powiedział, ze nie umiesz zjeść łyżką zupy pomidorowej, bo uczyłeś się jeść ogórkową

1 użytkowników online, w tym zalogowanych: 0, gości: 1