Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

Pętla for z dwoma warunkami

Idź do strony 1, 2, 3  Następny

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Python
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Caporeira



Dołączył: 26 Lis 2015
Posty: 49

PostWysłany: Pon Lut 22, 2016 11:28 pm  OP    Temat postu: Pętla for z dwoma warunkami Odpowiedz z cytatem Pisownia

Witam,

napisałem taką pętle, ale nie robi ona tego czego od niej oczekuje.
W tej chwili wyświetla mi wartości kolumny 3 kilka ryzy tą samą wartość jeśli spełniony jest pierwszy warunek if 'Scanner'.
Kod:

for i in range(3, row_count+1):                                            
        if 'Scanner' in sheet.cell(row=i, column=4).value:
            wartosc1 = sheet.cell(row=i, column=1).value
            wartosc2 = sheet.cell(row=i+1, column=1).value
            for wartosc1 in wartosc2:
                print(sheet.cell(row=i, column=3).value)


moje warunki:

jeśli w kolumnie 4 znajdzie słowo 'Scanner' - pobierz z tego wiesza(row), kolumny nr 1 string.
jeśli pobrany string (z kolumny nr 1) jest taki sam jak w wierszu poniżej (row+1) - wyświetl zawartość kolumny 3
itd.

Jeśli stringi przestaną być takie same, to wyjdź z pętli i dalej szukaj 'Scanner'.

Jak to będzie poprawieni wyglądać ?

Dodane przez moderatora (łączenie postów)

Dziś wpadłem na pomysł aby wykonać to tak:

Kod:
row_count = sheet.max_row                                                   # licze ilosc wiersz
result = []

for i in range(3, row_count+1):                                             # ustalam zakres
        if 'Scanner' in sheet.cell(row=i, column=4).value:
            fgs = sheet.cell(row=i, column=1).value
            result.append(fgs)

elem = []

for j in range(3, row_count+1):
    if result[j] in sheet.cell(row=j, column=1).value:
        name = sheet.cell(row=j, column=3).value[3:]
        elem.append(name)



Lecz wyrzuca mi błąd:

Cytat:
if result[j] in sheet.cell(row=j, column=1).value:
IndexError: list index out of range


Pierwsza pętla działa dobrze, ale problem jest z drugą. Jak to naprawić ?

Od moderatora: czy komunikat błędu jest kodem źródłowym? Nie, więc po co go jako taki oznaczasz?! marcin_an
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
hurgadion



Dołączył: 06 Kwi 2011
Posty: 853
Skąd: Web :)

PostWysłany: Sro Lut 24, 2016 4:49 pm      Temat postu: Odpowiedz z cytatem Pisownia

Witaj,
wydaje mi się, że iteracja drugiej pętli powinna przebiegać po
Kod:

range(len(result))


Pozdrawiam.

_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
Caporeira



Dołączył: 26 Lis 2015
Posty: 49

PostWysłany: Sro Lut 24, 2016 8:53 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Ok, już wiem gdzie był mój błąd.

Kod:
for j in range(1, row_count):
    for k in range(0, len(result)):
        if sheet.cell(row=j, column=1).value in result[k]:
            name = sheet.cell(row=j, column=3).value[3:]
            elem.append(name)



Zamieniłem kolejność w drugiej linii i dodałem drugą pętle for.

Teraz zapisuje mi wszystkie wyniki do jednej tablicy (elem). A chciałbym aby te wyniki były jakoś podzielone na tyle części ile wynosi len(result).

Co dopisać aby to zrealizować ?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
hurgadion



Dołączył: 06 Kwi 2011
Posty: 853
Skąd: Web :)

PostWysłany: Sro Lut 24, 2016 9:25 pm      Temat postu: Odpowiedz z cytatem Pisownia

nie rozumiem jak te wyniki mają być podzielone... czy mógłbyś podać jakiś konstruktywny i w miarę prosty przykład jak ta ma działać... ? :)
_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
Caporeira



Dołączył: 26 Lis 2015
Posty: 49

PostWysłany: Sro Lut 24, 2016 10:05 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Ok, postaram się to lepiej wytłumaczyć:

np.

if sheet.cell(row=j, column=1).value in result[0] - zapisać do tablicy - tablica[0][i]
if sheet.cell(row=j, column=1).value in result[1] = tablica[1][i]
if sheet.cell(row=j, column=1).value in result[2] = tablica[2][i]
Kod:

for j in range(1, row_count):
    for k in range(0, len(result)):
        if sheet.cell(row=j, column=1).value in result[0] = tablica[0][0]
        if sheet.cell(row=j, column=1).value in result[0] = tablica[0][1]
        if sheet.cell(row=j, column=1).value in result[0] = tablica[0][2] - pierwszy warunek spełnić się 3 razy
        if sheet.cell(row=j, column=1).value in result[1] = tablica[1][0] - drugi warunek spełnił się tylko raz
        if sheet.cell(row=j, column=1).value in result[2] = tablica[2][0]
        if sheet.cell(row=j, column=1).value in result[2] = tablica[2][1] - trzeci warunek spełnić się 2 razy

itd.


Potem chce np wypisać wszystkie wyniki z pierwszego warunku, gdzie warunkiem jest result[0]. Wyników będę miał "i" - tablica[0][i].
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
hurgadion



Dołączył: 06 Kwi 2011
Posty: 853
Skąd: Web :)

PostWysłany: Czw Lut 25, 2016 11:25 am      Temat postu: Odpowiedz z cytatem Pisownia

dalej nie rozumiem :( jak chcesz te wyniki wypisać ? Nie wystarczy wypisać tych wyników z tablicy elem ? Jeżeli nie, to podaj w miarę dokładny i obrazujący przykład jak ma to działać, ponieważ to jest niestety dla mnie niezrozumiałe... :)
_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
Caporeira



Dołączył: 26 Lis 2015
Posty: 49

PostWysłany: Czw Lut 25, 2016 2:06 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Bardzo dziękuje za chęci zrozumienia :)

result[0] = 'K003'
result[1] = 'K006'
result[2] = 'K009'

print(result) = {'K003' , 'K006', 'K009'}

if sheet.cell(row=j, column=1).value in result[0]
jeśli wartość komórki równa = 'K003'

if sheet.cell(row=j, column=1).value in result[1]
jeśli wartość komórki równa = 'K006'

if sheet.cell(row=j, column=1).value in result[2]
jeśli wartość komórki równa = 'K009'

Wtedy w tablicy mam wyniki spełniające warunek dla 'K003', 'K006' i 'K009' (wszystkie razem).

Przykładowy wynik:
elem = {'x1', 'x2', '2x', 'dd', 'yy4', 'ffdf', 'dffsaa'}

Załóżmy że ten if:

if sheet.cell(row=j, column=1).value in result[1]
jeśli wartość komórki równa = 'K006'

wpisał do tablicy elem{} stringi: '2x' oraz 'dd'

Pytanie jak wyświetlić te 2 stringi ? Bo ja nie wiem ile ich będzie i na której pozycji w tablicy elem{}

Od moderatora: przestań cytować bez sensu! marcin_an
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
hurgadion



Dołączył: 06 Kwi 2011
Posty: 853
Skąd: Web :)

PostWysłany: Czw Lut 25, 2016 3:53 pm      Temat postu: Odpowiedz z cytatem Pisownia

jeżeli dobrze zrozumiałem postawiony problem i Twój kod, to spróbuj wykorzystać słownik, na przykład tak:
Kod:

elem={}
for j in range(1, row_count):
    for k in range(0, len(result)):
        if sheet.cell(row=j, column=1).value in result[k]:
            name = sheet.cell(row=j, column=3).value[3:]
            if  sheet.cell(row=j, column=1).value in V.keys():
                elem[sheet.cell(row=j, column=1).value].append(name)
            else:
                 elem[sheet.cell(row=j, column=1).value]=[name]


Przetestuj kod, pisałem z palca, pozdrawiam.

_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
Caporeira



Dołączył: 26 Lis 2015
Posty: 49

PostWysłany: Czw Lut 25, 2016 4:24 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Niestety nie działa:

Cytat:
if [sheet.cell(row=j, column=1).value] in V.keys():
NameError: name 'V' is not defined


A jak zmieniłem na result.keys():
Cytat:
AttributeError: 'list' object has no attribute 'keys'
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
hurgadion



Dołączył: 06 Kwi 2011
Posty: 853
Skąd: Web :)

PostWysłany: Czw Lut 25, 2016 4:53 pm      Temat postu: Odpowiedz z cytatem Pisownia

Sorki,
pomyliłem zmienną, za V wstaw raczej zmienną elem... :)

_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Python Wszystkie czasy w strefie CET (Europa)
Idź do strony 1, 2, 3  Następny
Strona 1 z 3

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.23297 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |