Uproszczenie pętli for

0

Hej, da się jakoś uprościć taką pętlę, aby była np. 1-2 linijki?

for npc in npcs:
    for skill in npc.skills:
        if skill.code == "Ultimate":
            return True
6

W jakim celu chciałabyś ją zmniejszyć?

Przytoczony przez Ciebie kod jest prosty, czytelny -- nic tylko marzyć, aby wszystko było tak łatwe w zrozumieniu :-)

47
for npc in npcs:
    if any(skill == "Ultimate" for skill in npc.skills)
        return True

PS mozna i tego npc nawet zawrzec w comprehension i skrocic to do dwoch linijek ale czytelnosc dostanie pod dupie wiec grac nie warta swieczki dla tej 1 linijki.

1
return True if any(any(skill.code==skillcode for skill in npc.skills) for npc in npcs)

?

3

Jeżeli często musisz wyszukiwać po skillach po kodzie to może mieć sens aby zaimplementować swój własny kontener z nadpisaną magiczną metodą __contains__

class Skill:
    def __init__(self, code):
        self.code = code


class Skills:
    def __init__(self):
        self._skills = []

    def __len__(self):
        return len(self._skills)

    def __getitem__(self, position):
        return self._skills[position]
        
    def __contains__(self, code):
        return any(s.code==code for s in self._skills)

    def append(self, skill):
        self._skills.append(skill)


class NPC:
    skills = Skills()

I teraz znika ci jeden poziom zagnieżdżenia przy wyszukiwaniach

npcs = [NPC(), NPC(), NPC()]
npcs[1].skills.append(Skill("Ultimate"))

any(npc for npc in npcs if "Ultimate" in npc.skills) # True
3
pytająca napisał(a):

Hej, da się jakoś uprościć taką pętlę, aby była np. 1-2 linijki?

for npc in npcs:
    for skill in npc.skills:
        if skill.code == "Ultimate":
            return True

Uprościć nie, da się co najwyżej poprzenosić złożoność z miejsca na miejsce (jak przy rozwiązaniu z list comprehension), ale to samooszukiwanie się. Ten kod jest już prosty, po co go komplikować?

Dałoby się co prawda w ogóle inaczej trzymać te dane (w jakiś inny sposób), ale to by była wtedy bardziej kwestia struktur danych i ew. ich wydajności przy wyszukiwaniach, a nie tego, czy są 2 linijki czy 10.

0
Spearhead napisał(a):

Jeżeli często musisz wyszukiwać po skillach po kodzie to może mieć sens aby zaimplementować swój własny kontener z nadpisaną magiczną metodą __contains__

class Skill:
    def __init__(self, code):
        self.code = code


class Skills:
    def __init__(self):
        self._skills = []

    def __len__(self):
        return len(self._skills)

    def __getitem__(self, position):
        return self._skills[position]
        
    def __contains__(self, code):
        return any(s.code==code for s in self._skills)

    def append(self, skill):
        self._skills.append(skill)


class NPC:
    skills = Skills()

Ale złe rozwiązanie.

Jak już masz robić takie czary, to lepiej dodać @property z generatorem:

class NPC:
  @property
  def skills(self):
    for skill in self._skills:
      yield skill

i po sprawie.

Nie mówiąc o tym statycznym polu.

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