Vorschlag zur besseren gegenseitigen Hilfe (OOP nutzen)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

Vorschlag zur besseren gegenseitigen Hilfe (OOP nutzen)

Beitragvon qweet » Mittwoch 25. Januar 2006, 15:08

Vorschlag zur besseren gegenseitigen Hilfe (OOP nutzen)

Grüße,

mir als programmierer, entwickler geht es oft so, dass ich gerne gewisse Sachen umsetzen würde, aber ich meist an den vielen kleinen problemen scheitere, in die das große Problem zerfällt.

So musste ich mir vor kurzem überlegen, wie ich es hinbekommen, aus einer Liste unbekannter Länge und unbekannten Inhalts von Zahlen, wie ich daraus bestimmte Zahlen herausfiltere. Herausgekommen ist das hier:

Code: Alles auswählen

   def filter_number_from_list(trend_list, number_to_filter):
   # EXAMPLE
   # 1) INPUT: trend_list = [5, 0, -3, -1, 4, 0, 6, 4], number_to_filter = 0
   # 2) OUTPUT: trend_list = [5, -3, -1, 4, 6, 4]
   
      # INIT
      number_to_filter_counter = 0
      
      # FILTER
      for i in trend_list:
         if i == number_to_filter:
            number_to_filter_counter += 1
            
      for i in range(number_to_filter_counter):
         trend_list.remove(number_to_filter)
      
      # RETURN
      return trend_list


Es kann ja nun durchaus sein, dass dieser befehl schon exestiert und ich mir vergeblich Mühe gemacht habe, aber eh ich erst poste und die antworten abwarte und auswerte, schreib ich mir eben lieber selber schnell eine lösung. vielleicht geht es anderen auch so und ich fände es dumm, wenn jeder das gleiche Problem lösen müsste.

Ich möchte daher einen Anstoß geben, dass jeder vielleicht versucht etwas offener und allgemeiner zu programmieren, so könnten wir gegenseitig überschneidende Probleme schneller lösen. Eine Art pool für Probleme einfacher Art aufbauen.
Wenn ich nicht erst lang nachdenken muss über irgend ein kleines Problem, weil das eben schon im "pool" gelöst ist, kann ich mich schon wieder um ein anderes kümmern und so dem pool wieder etwas hinzufügen.

Hier noch die Klasse in der die Funktion zu finden ist:

Code: Alles auswählen

class make_calculations:
   # new_random_numbers: INPUT A LIST OF INTEGERS. EX: [1, 1, -1, 1, -1]
   # connect_how_many: INPUT THE INTEGERS: 1 OR 2
   
   def __init__(self, new_random_numbers, connect_how_many):
      
      # INPUT
      self.new_random_numbers = new_random_numbers
      self.connect_how_many = connect_how_many
      # /INPUT
      
      # OUTPUT
      self.trend_list = []
      # /OUTPUT
   
   def connect_trends_of_same_direction_together(self, list_of_positive_and_negative_integers):
   # EXAMPLE
   # 1) INPUT: list_of_positive_and_negative_integers = [1, -1, 5, 4, 3, -1, -6, -5]
   # 2) OUTPUT: trend_list = [1, -1, 12, -12]
      
      # INIT
      trend_direction = ''
      up_trend_length = 0
      down_trend_length = 0
      trend_list = []
      
      # CONNECTING
      for i in range(len(list_of_positive_and_negative_integers)):
         if (trend_direction != 'DOWN'):
            if (list_of_positive_and_negative_integers[i] > 0):
               up_trend_length += list_of_positive_and_negative_integers[i]
               trend_direction = 'UP'
            elif (trend_direction == 'UP'):
               trend_list.append(up_trend_length)
               up_trend_length = 0
               trend_direction = 'DOWN'
            
            if (list_of_positive_and_negative_integers[i] < 0):
               down_trend_length += list_of_positive_and_negative_integers[i]
               trend_direction = 'DOWN'
            elif (trend_direction == 'DOWN'):
               trend_list.append(down_trend_length)
               down_trend_length = 0
               trend_direction = 'UP'
               
               
         elif (trend_direction != 'UP'):
            if (list_of_positive_and_negative_integers[i] < 0):
               down_trend_length += list_of_positive_and_negative_integers[i]
               trend_direction = 'DOWN'
            elif (trend_direction == 'DOWN'):
               trend_list.append(down_trend_length)
               down_trend_length = 0
               trend_direction = 'UP'
            
            if (list_of_positive_and_negative_integers[i] > 0):
               up_trend_length += list_of_positive_and_negative_integers[i]
               trend_direction = 'UP'
            elif (trend_direction == 'UP'):
               trend_list.append(up_trend_length)
               up_trend_length = 0
               trend_direction = 'DOWN'
            
      if trend_direction == 'UP':
         trend_list.append(up_trend_length)
      elif trend_direction == 'DOWN':
         trend_list.append(down_trend_length)
         
      # RETURN
      return trend_list
   
   
   def connect_trends(self, connect_how_many, trend_list):
   # connect_how_many ONLY FOR VALUES: 1 OR 2
   
   # EXAMPLE
   # 1) INPUT: connect_how_many = 2, trend_list = [5, -3, -1, 4, 6, 4]
   # 2) OUTPUT: new_trend_list = [2, 3, 10]
   
      # INIT
      old_trend_list_is = ''
      if len(trend_list) % 2 == 1:
         old_trend_list_is = 'UNEVEN'
         trend_list.pop()
      else:
         old_trend_list_is = 'EVEN'
      
      # CONNECT THE TRENDS
      new_trend_list = []
      new_current_trend = 0
      for i in range(len(trend_list)/connect_how_many):
         new_current_trend = 0
         for j in range(connect_how_many):
            new_current_trend += trend_list[connect_how_many*i + j]
         new_trend_list.append(new_current_trend)
      
      # RETURN
      return new_trend_list
   
   
   def filter_number_from_list(self, trend_list, number_to_filter):
   # EXAMPLE
   # 1) INPUT: trend_list = [5, 0, -3, -1, 4, 0, 6, 4], number_to_filter = 0
   # 2) OUTPUT: trend_list = [5, -3, -1, 4, 6, 4]
   
      # INIT
      number_to_filter_counter = 0
      
      # FILTER
      for i in trend_list:
         if i == number_to_filter:
            number_to_filter_counter += 1
            
      for i in range(number_to_filter_counter):
         trend_list.remove(number_to_filter)
      
      # RETURN
      return trend_list


   def do_action(self):
      # CONNECTS ALL -1s AND 1s (1, 1, 1 --> 3, -1, -1, -1 --> -3)
      self.trend_list = self.connect_trends_of_same_direction_together(self.new_random_numbers)
      
      # CONNECTS TWO DIFFERENT TRENDS ex(2, -3) --> -1
      self.trend_list = self.connect_trends(self.connect_how_many, self.trend_list)
      
      # IF ZERO APPEARS IT GETS FILTERED
      self.trend_list = self.filter_number_from_list(self.trend_list, 0)
      
      # if TWO POSITIVE TRENDS ARE IN A ROW
      # then THEY ARE GETTING CONNECTED TO ONE
      self.trend_list = self.connect_trends_of_same_direction_together(self.trend_list)



cu, qweet
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Mittwoch 25. Januar 2006, 15:26

Hi!

Naja, ich würde fast sagen, dass genau dafür die Codesnippets da sind, oder? ;)

Dein Problem würd ich übrigens so lösen, oder überseh ich da etwas:

Code: Alles auswählen

def my_filter(lst, number):
    return [x for x in lst if x != number]

EDIT: und so wenn man mehrere Zahlen übergeben können soll:

Code: Alles auswählen

def my_filter(lst, numbers):
    return [x for x in lst if x not in numbers]
lst = [1,2,3,1,2,3,1,2,3]
print my_filter(lst, [2,3])


Gruß, mawe
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

Beitragvon qweet » Mittwoch 25. Januar 2006, 15:35

cool :)

ja wenn ich das vorher gewusst hätte...

naja, genau das mein ich halt. Vielleicht nen Sticky-thread wo man ne dokumentierte lösung für ein sehr allgemeines problem reinstellt.

Oder vielleicht auch, wie man viele kleinere Lösungen zusammenfassen kann um ein größeres Problem zu lösen. Das man halt irgendwie dieses Baukastenprinzip umsetzt.

und alle lösungen in dem sticky-thread funktionieren halt, sind getestet. Da muss man sich dann keine platte mehr drüber machen.

so in etwas vielleicht.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 25. Januar 2006, 15:42

qweet hat geschrieben:naja, genau das mein ich halt. Vielleicht nen Sticky-thread wo man ne dokumentierte lösung für ein sehr allgemeines problem reinstellt.

Dafür haben wir ja das Wiki: [wiki]Tipps und Tricks[/wiki]

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Mittwoch 25. Januar 2006, 15:46

Woll ich auch grade schreiben, jens war wider mal schneller :)

PS: Ist das mit dem Wiki linken neu? Hab ich irgendwie verpasst :)
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

Beitragvon qweet » Mittwoch 25. Januar 2006, 15:48

:oops:
aber den kannte ich noch nicht. na danke auf jeden :)
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 25. Januar 2006, 15:52

mawe hat geschrieben:PS: Ist das mit dem Wiki linken neu? Hab ich irgendwie verpasst :)

Yes: http://www.python-forum.de/viewtopic.php?t=4800

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Mittwoch 25. Januar 2006, 15:52

Naja, früher hatten wir einen Link dazu, der scheint weg zu sein.

Übrigens, die anderen beiden Funktionen Deiner Klasse versteh ich irgendwie nicht. Kannst Du die ein bisschen erklären, vielleicht gibts da auch noch kürzere Wege.

EDIT: @jens: peinlich :oops: Aber wer liest schon die Ankündigungen :)
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

Beitragvon qweet » Mittwoch 25. Januar 2006, 16:05

eben wer liest schon ankündigungen. das ist was für weicheier und warmduscher :lol:

naja. ok.

also wegen der anderen zwei methoden:

Code: Alles auswählen

def connect_trends_of_same_direction_together

hat die aufgabe eine liste mit integer zusammenzufassen. alle positiven zahlen sollen addiert werden, bis die nächste negative zahl kommt. sobald das der fall ist, sollen alle negativen zahlen addiert werden, bis die nächste positive kommt...usw.

Code: Alles auswählen

def connect_trends(self, connect_how_many, trend_list):

hat die aufgabe 2 werte aus einer liste miteinander zu verbinden. dann die nächsten zwei usw. Ich hätte es eigentlich gerne so, dass ich auch 3 oder 4 werte miteinander verbinde. wusste aber nicht wie das geht. naja, damit ich wenigstens was habe, hab ich halt vorlieb genommen mit nur 2 werten.

auf alle fälle ist nicht bekannt was in der liste ist und wie lang die liste ist.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Mittwoch 25. Januar 2006, 16:16

Code: Alles auswählen

def connect_trends(lst, n):
    return [sum(lst[i:i+n]) for i in range(0,len(lst),n)]

lst = [5, -3, -1, 4, 6, 4]
print connect_trends(lst, 2)   # -> [2, 3, 10]
print connect_trends(lst, 3)   # -> [1, 14]

:D
Zuletzt geändert von mawe am Mittwoch 25. Januar 2006, 16:46, insgesamt 1-mal geändert.
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

Beitragvon qweet » Mittwoch 25. Januar 2006, 16:18

ich weiß jetzt nicht ob es sowas schon in der art gibt, hab mir das wiki noch nicht sooo sehr angeschaut, aber ich hätt gern eine art problem-lösungs-wiki.

bsp:

--

problem: "filter specific numbers from a list of integers"

EXAMPLE
1) INPUT: list = [5, 0, -3, -1, 4, 0, 6, 4], number_to_filter = 0
2) OUTPUT: list = [5, -3, -1, 4, 6, 4]

solution version 1

Code: Alles auswählen

def my_filter(list, numbers):
    return [x for x in lst if x not in numbers]


solution version 0

Code: Alles auswählen

    def filter_number_from_list(trend_list, number_to_filter):
    # EXAMPLE
    # 1) INPUT: trend_list = [5, 0, -3, -1, 4, 0, 6, 4], number_to_filter = 0
    # 2) OUTPUT: trend_list = [5, -3, -1, 4, 6, 4]
   
        # INIT
        number_to_filter_counter = 0
       
        # FILTER
        for i in trend_list:
            if i == number_to_filter:
                number_to_filter_counter += 1
               
        for i in range(number_to_filter_counter):
            trend_list.remove(number_to_filter)
       
        # RETURN
        return trend_list

Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 25. Januar 2006, 16:21

qweet hat geschrieben:ich weiß jetzt nicht ob es sowas schon in der art gibt, hab mir das wiki noch nicht sooo sehr angeschaut, aber ich hätt gern eine art problem-lösungs-wiki.

Das solltest du mal nachholen... Denn dafür ist genau [wiki]Tipps und Tricks[/wiki] da :)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Mittwoch 25. Januar 2006, 16:38

Code: Alles auswählen

def connect(lst):
    new = []
    tmp = lst[0]
    for i in range(1, len(lst)):
        if lst[i-1] * lst[i] < 0:
            new.append(tmp)
            tmp = lst[i]
        else: tmp += lst[i]
    new.append(tmp)
    return new

lst = [1, -1, 5, 4, 3, -1, -6, -5]
print connect(lst)
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

Beitragvon qweet » Mittwoch 25. Januar 2006, 17:01

mawe hat geschrieben:

Code: Alles auswählen

def connect_trends(lst, n):
    return [sum(lst[i:i+n]) for i in range(0,len(lst),n)]

lst = [5, -3, -1, 4, 6, 4]
print connect_trends(lst, 2)   # -> [2, 3, 10]
print connect_trends(lst, 3)   # -> [1, 14]

:D


lst = [5, -3, -1, 4, 6, 4, -3]
connect_trends(list, 2)

Traceback (most recent call last):
File "<pyshell#17>", line 1, in -toplevel-
connect_trends(list, 2)
File "<pyshell#15>", line 2, in connect_trends
return [sum(list[i:i+n]) for i in range(0,len(list),n)]
TypeError: len() of unsized object

das ist nicht gut. ;) Aber ansonsten ist dein Code cool.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Mittwoch 25. Januar 2006, 17:06

Code: Alles auswählen

lst = [5, -3, -1, 4, 6, 4, -3]
connect_trends(list, 2)

Die Liste heisst lst, nicht list :)
list ist ein Python-Keyword, kann zu kuriosen Fehlern führen, wenn man so etwas als Variablennamen verwendet ;)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder