Przerwanie pętli for nie stosując break - jak?

Odpowiedz Nowy wątek
2020-03-21 16:09

Rejestracja: 2 lata temu

Ostatnio: 16 godzin temu

0

Witajcie,

nie mogę przedstawić całego kodu, jednak postaram się przedstawić na jakim rezultacie mi zależy.
Otóż jest lista, którą muszę iterować pętlą for. W liście znajdują się elementy, które się powtarzają.
Jak wyłuskać za pomocą for pierwszy występujący na liście element, nie stosując przy tym
instrukcji break?

Będę wdzięczny za okazaną pomoc.

Skąd te przymusy? Zadanie szkolne? - AnyKtokolwiek 2020-03-21 16:31

Pozostało 580 znaków

2020-03-21 16:24

Rejestracja: 4 lata temu

Ostatnio: 9 godzin temu

0

Pierwszy występujący na liście element, kropka; czy pierwszy który się powtarza? Jesteś przyspawany do tej pętli for, czy chcesz po prostu dobre rozwiązanie?

Pozostało 580 znaków

2020-03-21 16:28

Rejestracja: 2 lata temu

Ostatnio: 16 godzin temu

0

Chcę uzyskać jeden - pierwszy z powtarzających się kilku elementów.
np pragnę uzyskać `a' gdy lista = ['a', 'b', 'c', 'a', 'd', 'e', 'a']

Raczej jestem jak to nazywasz przyspawany do fora z uwagi na istotę działania programu i również szykowność.
Łączę pythona z gtk3 pod linuksem.

Chętnie jednak zobaczę również inne rozwiązania, może będą dla mnie inspiracją.

Pozostało 580 znaków

2020-03-21 16:28

Rejestracja: 1 rok temu

Ostatnio: 12 godzin temu

1

pętla for iteruje do czasu aż dostanie wyjątek StopIteration. Taki tam prosty przykład:

def get_only_first(lista):
    yield lista[0]

mylist = [1,2,3,4,5]
mylist1st = get_only_first(mylist)

for i in mylist1st:
    print(f'list[..]={i}')
źle zrozumiałeś problem. Taka dana wejsciowa [ 1, 2, 3, 2, 4] ma zwrócić 2. - MarekR22 2020-03-21 21:37

Pozostało 580 znaków

2020-03-21 16:43

Rejestracja: 4 lata temu

Ostatnio: 9 godzin temu

1

Jasne. Normalne rozwiązanie jest z break-iem lub pętlą while i zbiorem wartości, coś na tę modłę:

unique_values = set()

for x in list:
    if x in unique_values:
        first_duplicate = x
        break
    unique_values.add(x)

(while podobnie — while not first_duplicate is None czy coś takiego)

Rozwiązanie udziwniane wykorzystać może collections.Counter lub ogólny słownik:

from collections import Counter

repetition_counter = Counter()

for x in list:
    repetition_counter[x] += 1

i stąd sobie możesz odfiltrować co chcesz.

Nie tak należy używać countera :c repetition_counter = Counter(list) - enedil 2020-03-24 23:15
Ta, ale on chciał „for-a bez break-a”, a to było najmniej dzikie rozwiązanie, jakie mi przyszło do głowy… - Althorion 2020-03-25 07:10

Pozostało 580 znaków

2020-03-21 17:21

Rejestracja: 2 lata temu

Ostatnio: 16 godzin temu

0

Dzięki Panowie.

Pozostało 580 znaków

2020-03-21 17:28

Rejestracja: 2 lata temu

Ostatnio: 55 minut temu

3

Z użyciem podstawowych narzędzi:

next(iter([el for i, el in enumerate(lista) if el in lista[:i] + lista[i+1:]]))

Zgarnia zawsze pierwszy pojawiający się duplikat na liście.

EDIT:
Lub równoważnie:

[el for i, el in enumerate(lista) if el in lista[:i] + lista[i+1:]][0]
edytowany 1x, ostatnio: Pyxis, 2020-03-21 17:42
Dzięki, właśnie siedziałem nad takim golfem! - Althorion 2020-03-21 17:36
Dodałem alternatywną wersję w poście. - Pyxis 2020-03-21 17:42

Pozostało 580 znaków

2020-03-21 22:03

Rejestracja: 12 lat temu

Ostatnio: 1 minuta temu

l = [1,2,3,4,5, 4]
duplicates = (x for x in l if l.count(x) > 1)
print(next(duplicates))

https://ideone.com/nFT1Py


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2020-03-22 17:17

Rejestracja: 2 lata temu

Ostatnio: 16 godzin temu

0

MarekR22 - dzięki.
Podpowiedz tylko jak stosować tą konstrukcję ze stringiem?

edytowany 1x, ostatnio: nUmer, 2020-03-25 10:57
w python masz "duck typing", ergo kod zadziała bez zmian dla napisu. - MarekR22 2020-03-25 11:00
jeszcze raz, dzięki. - nUmer 2020-03-25 11:02

Pozostało 580 znaków

Odpowiedz

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