generator object

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.
Antworten
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Hallo miteinander

Ich habe ein generator-object (<generator object shift at 0xb770aa7c>), das ich gerne anzeigen (ausprinten) möchte. Wie macht man das?
(Ich habe eine starmap benutzt: "(sorted((starmap(shift, verfueg.items())), key=by_weight, reverse=True))")

Vielen Dank,
Marcel
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Einfach mit einer for-Schleife über jedes Element gehen:

Code: Alles auswählen

for elem in gen:
    print elem
oder kurz:

Code: Alles auswählen

print list(gen)
Das Leben ist wie ein Tennisball.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Hm..so ganz klappt das noch nicht.
Im Moment habe ich sowas:

Code: Alles auswählen

result = (sorted((starmap(shift, verfueg.items())), key=by_weight, reverse=True))
  if result:
    shifts = result[0]
    if all(preference for choice, pair in shifts for name, preference in pair):
      print 'solution found:.' 
    else:
      print 'best solution is:'
    print
    pprint.pprint(shifts)
  else: 
    print 'no way.'
Und mit deiner Methode erhalte ich immernoch sowas: "<generator object shift at 0xb77deaa4>"
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Was heißt denn "klappt noch nicht"? Als Fehlerbeschreibung ist das ein wenig knapp.

Lass mich raten: "shifts" ist eine Liste mit Generatoren? Das würde erklären warum pprint eine falsche Ausgabe macht. Zweite Vermutung: Du hast meine Lösung so umgesetzt:

Code: Alles auswählen

for shift in shifts:
    print shift
du iterierst über die Liste und nicht die Generatoren.

Um an das Maximum einer Liste zu kommen muss man diese übrigens nicht vollständig sortieren. Es gibt da so eine max-Funktion ;-)
Das Leben ist wie ein Tennisball.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Du hast Recht, die Fehlerbeschreibung ist zu knapp. Daher hier ausführlicher:
Ich habe momentan folgender Code:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import pprint
from collections import defaultdict
from itertools import product, starmap, permutations

data = defaultdict(list)

choices = 'eistee cola mineral sinalco'.split()
names = 'hans lea sonja'.split()
verfueg = {'eistee':2, 'cola':3, 'mineral':2, 'sinalco':1}

# Präferenzen: 1 für erste präferenz, 2 für zweite präferenz
data['eistee', 'hans'] = 1
data['cola', 'hans'] = 2
data['eistee', 'lea'] = 1
data['mineral', 'lea'] = 2
data['cola', 'sonja'] = 1
data['mineral', 'sonja'] = 2


def shift(choice, size):
  for pair in permutations(names, size):
    yield choice, frozenset((name, data.get((choice, name), 0)) for name in pair)


def generatePair():
  for sorte in verfueg:
    yield verfueg[sorte]


def output():
  result = (sorted((starmap(shift, verfueg.items())), reverse=True))
  if result:
    shifts = result[0]
    if all(preference for choice, pair in shifts for name, preference in pair):
      print 'Solution found.' 
    else:
      print 'No solution for all preferences found.'
      print 'Best solution is:'
    print
    pprint.pprint(shifts)
  else: 
    print 'No solution found.'

if __name__ == "__main__":
  generatePair()	
  output() 
Der Code sollte eine Lösung zurückgeben, bei der angegeben wird, wer (hans, lea, sonja) welches Trinken bekommt. Der Vorrat an Trinken habe ich als Beispiel schon eingefügt, genau so die Präferenzen der Personen.
Im Grunde funktioniert der Code, wenn ich dann nicht ein "<generator object shift at 0xb775b57c>" zurück bekäme... :)
Danke für die Hilfe!
Zuletzt geändert von MarcelF6 am Sonntag 11. November 2012, 15:37, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich hatte dir ja schon geschrieben: MINIMALES lauffähiges Beispiel.
Das Leben ist wie ein Tennisball.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

*verbessert.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Marcel,

vielleicht solltest Du mal schreiben, was Du machen willst und nicht, wie Deine Versuche in Python
dazu aussehen. Dein Code macht für mich nämlich keinen Sinn.
Mit sorted(starmap(shift, verfueg.items()), reverse=True) erzeugst Du 4 Generatoren, die
Python versucht zu sortieren. Und in welcher Reihenfolge?
Da für Generatoren keine Vergleichsoperatoren existieren, werden sie nach ihrer Speicheraddresse
sortiert. Hast Du Dir jemals angeschaut, was in result steht?
Du kannst Dir auch weitere Fragen stellen:
Was soll shift generieren?
Und was tut es tatsächlich?
Was hat generatePair hier verloren?
Und warum testet jeder Programmierer zuerst seine Funktionen einzeln,
bevor er das gesamte Programm auch nur einmal laufen läßt?

Grüße
Sirius
Antworten