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
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
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 :-)
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.
return True if any(any(skill.code==skillcode for skill in npc.skills) for npc in npcs)
?
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
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.
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.