porównaniem elementów z przedziałem w liście

0

Cześć, mam problem z porównaniem elementów z przedziałem w liście.

Chciałbym żeby elementy z listy został zapisany do pliku tylko w określonych przedziałach.

Miało by to wyglądać w taki sposób:
Przedział nr. 1 (237, 349)
Zapisane elementy l
324
325
326
327
328
329
330

Przedział nr. 2 (351, 463)
440
441
442
443
444
445
446

lista_elementow = [[324,325,326,327,328,329,330],[440,441,442,443,444,445,446]......]-> lista ma około 200 elementów

lista_przedzialow = [(237,349), (351,463)....]-> tez około 200 przedziałów

Zrobiłem coś takiego, żeby elementy zostały zapisane, ale niestety to nie działa:(

for element in lista_elementow:
    for przedział in lista_przedzialow:
        if element in lista_przedzialow:
            Zapis.write(element)
2
faraon90 napisał(a):

Zrobiłem coś takiego, żeby elementy zostały zapisane, ale niestety to nie działa:(

Wyjaśnij na czym polega, że "nie działa", żeby można postawić skuteczną diagnozę.

Lista elementów to lista list elementów.
Przedział zawiera 2 liczby, a nie wszystkie liczby z przedziału, więc nie wiem czego Ty oczekujesz od operatora in.
Poza tym w swoim kodzie nawet nie sprawdzasz, czy element jest w przedziale, tylko czy jest w liście przedziałów. Po co iterujesz po przedziałach, skoro ich nie używasz?
Prędzej powinno być:

#...
    for przedział in lista_przedzialow:
        if element in range(przedział[0], przedział[1] + 1):
            Zapis.write(element)

Programuj z głową. Dokładnie to co chcesz osiągnąć. Nie oczekuj, że nieprzemyślane linie kodu, zrobią to czego się spodziewasz.

1

Jak wyżej, a przejechałeś to debugerem?

0

Napisałem taki przedział, niestety nadal to nie działa tak jak bym chciał. Elementy są zapisywanie, ale informacje do jakiego przedziału należą są nieprawidłowe. Dostaje informacje że należą do abu.

for element in lista_elementow:
    for e in element:
        for przedział in lista_przedzialow:
            print("przedział:", przedział)
            if e>=przedział[0] and e <= przedział[1]:
                Zapis.write(element)
0
if e>=przedział[0] and e <= przedział[1]:

Masz nieostrą nierówność. Może to jest problemem?

0

Sprawdziłem tego ifa w debuger i działa ok, tak mi się wydaje. To musi być gdzie inna przyczyna.

Wartości ciągle wpadają do jednego worka
Przedział nr. 1
Wszystkie elementy z obu list z lista_elementow
Przedział nr. 2
Wszystkie elementy z obu list z lista_elementow

0

Troszeczkę off-topic, dla zainteresowanych, pozwalam sobie dorzucić wersję w Chomiku.

#!chomik

let dodaj (ELEMENT:integer) = value code
{
    let aktualny element = value integer [(ELEMENT:integer)];
    <add "integer" <ilosc elementow w przedziale <aktualny przedzial>> 1>;
    let ilosc elementow w przedziale <aktualny przedzial> = <the add result "integer">;
    let element <aktualny przedzial> w <ilosc elementow w przedziale <aktualny przedzial>> = <aktualny element>;
};


let przedzial 1 poczatek = value integer 237;
let przedzial 1 koniec = value integer 349;
let aktualny przedzial = value integer 1;
let ilosc elementow w przedziale 1 = value integer 0;

<dodaj 324>;
<dodaj 325>;
<dodaj 326>;
<dodaj 327>;
<dodaj 328>;
<dodaj 329>;
<dodaj 330>;


let przedzial 2 poczatek = value integer 351;
let przedzial 2 koniec = value integer 463;
let aktualny przedzial = value integer 2;
let ilosc elementow w przedziale 2 = value integer 0;

<dodaj 440>;
<dodaj 441>;
<dodaj 442>;
<dodaj 443>;
<dodaj 444>;
<dodaj 445>;
<dodaj 446>;

let ilosc przedzialow = value integer 2;

#############################################################

let wypisz element jezeli lower i lower = value code {};
let wypisz element jezeli lower i equal = value code {};
let wypisz element jezeli lower i greater = value code {};
let wypisz element jezeli equal i lower = value code { <print <aktualny element>>; };
let wypisz element jezeli equal i equal = value code { <print <aktualny element>>; };
let wypisz element jezeli equal i greater = value code {};
let wypisz element jezeli greater i lower = value code { <print <aktualny element>>; };
let wypisz element jezeli greater i equal = value code { <print <aktualny element>>; };
let wypisz element jezeli greater i greater = value code {};


let sprawdz (ELEMENT:integer) w aktualnym przedziale = value code
{
    let numer elementu = value integer [(ELEMENT:integer)];
    let aktualny element = <element <aktualny przedzial> w <numer elementu>>;

    <compare "integer" <aktualny element> <przedzial <aktualny przedzial> poczatek>>;
    let rezultat porownania poczatek = <the compare result>;
    <compare "integer" <aktualny element> <przedzial <aktualny przedzial> koniec>>;
    let rezultat porownania koniec = <the compare result>;

    <wypisz element jezeli <rezultat porownania poczatek> i <rezultat porownania koniec>>;
};


let wypisz przedzial (PRZEDZIAL:integer) = value code
{
    let aktualny przedzial = value integer [(PRZEDZIAL:integer)];

    <print "przedzial" <aktualny przedzial>>;
    <sprawdz (ELEMENT:1..<ilosc elementow w przedziale <aktualny przedzial>>) w aktualnym przedziale>;
};

<wypisz przedzial (PRZEDZIAL:1..<ilosc przedzialow>)>;
0

Dziękuję, ale potrzebuję to w pythonie.

0

@faraon90:

class Przedzialy:
    def __init__(self):
        self.przedzialy = {}
        self.ilosc_przedzialow = 0

    def dodaj_przedzial(self, numer, poczatek, koniec):
        self.przedzialy[numer] = {
            'poczatek': poczatek,
            'koniec': koniec,
            'elementy': []
        }
        self.ilosc_przedzialow += 1

    def dodaj(self, element):
        aktualny_przedzial = self.przedzialy[self.aktualny_przedzial]
        aktualny_przedzial['elementy'].append(element)

    def ustaw_aktualny_przedzial(self, numer):
        self.aktualny_przedzial = numer

    def wypisz_element_jezeli(self, wynik_poczatek, wynik_koniec, element):
        if wynik_poczatek == "equal" or wynik_poczatek == "greater":
            if wynik_koniec == "equal" or wynik_koniec == "lower":
                print(element)

    def sprawdz(self, element):
        aktualny_przedzial = self.przedzialy[self.aktualny_przedzial]
        poczatek = aktualny_przedzial['poczatek']
        koniec = aktualny_przedzial['koniec']
        wynik_poczatek = self.porownaj(element, poczatek)
        wynik_koniec = self.porownaj(element, koniec)
        self.wypisz_element_jezeli(wynik_poczatek, wynik_koniec, element)

    def porownaj(self, element, granica):
        if element < granica:
            return "lower"
        elif element == granica:
            return "equal"
        else:
            return "greater"

    def wypisz_przedzial(self, numer):
        self.ustaw_aktualny_przedzial(numer)
        aktualny_przedzial = self.przedzialy[numer]
        print(f"przedzial {numer}")
        for element in aktualny_przedzial['elementy']:
            self.sprawdz(element)

    def wypisz_wszystkie_przedzialy(self):
        for i in range(1, self.ilosc_przedzialow + 1):
            self.wypisz_przedzial(i)


# Tworzenie przedzialow i dodawanie elementow
przedzialy = Przedzialy()
przedzialy.dodaj_przedzial(1, 237, 349)
przedzialy.ustaw_aktualny_przedzial(1)
for element in [324, 325, 326, 327, 328, 329, 330]:
    przedzialy.dodaj(element)

przedzialy.dodaj_przedzial(2, 351, 463)
przedzialy.ustaw_aktualny_przedzial(2)
for element in [440, 441, 442, 443, 444, 445, 446]:
    przedzialy.dodaj(element)

# Wypisywanie wszystkich przedzialow
przedzialy.wypisz_wszystkie_przedzialy()

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.