Verfasst: Sonntag 11. Mai 2008, 20:52
Das eine "get" hat mit dem anderen nichts zu tun. Guck mal hier:
http://docs.python.org/lib/typesmapping.html
http://docs.python.org/lib/typesmapping.html
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
titles = the_dicionary.get(the_artist, [])
titles.append(new_title)
the_dictionary[the_artist] = titles
Ist mir schon klar...allerdings sind LC nicht langsamer und vor allem in solchen Fällen einfach...direkter.EyDu hat geschrieben:Eine LC ohne Prädikat entspricht übrigens einem "map":
Code: Alles auswählen
import string with open('test.txt') as fh: data = map(string.split, fh) print data
Ich find halt, wenns schon eine extra split-Methode gibt, dann sollte man die auch nutzen:EyDu hat geschrieben:Soll ich jetzt noch Rücksicht auf Neulinge nehmen und deshalb praktische Funktionen nicht nutzen. Und wenn es um Direktheit geht, finde ich ein "map" viel sprechender. Zumindest, wenn man keine Lambda-Ausdrücke schreiben muss, das ist in einer LC kompakter.
Und jetzt bitte nicht mit dem "Zusatzimport" anfangen, das Thema hatten wir letztens doch erst
Code: Alles auswählen
>>> l = ['foo bar fooooobar', 'bar foo foobar']
>>> from itertools import imap
>>> call = lambda f: f()
>>> map(call, imap(operator.attrgetter('split'), l))
[['foo', 'bar', 'fooooobar'], ['bar', 'foo', 'foobar']]
Code: Alles auswählen
list(imap(call, imap(operator.attrgetter('split'), l)))
Und auch nur etwa halb so schnellEyDu hat geschrieben:Das ist wirklich Eleganz auf ganz hohem Niveau
Beim letzten will ich ja aber sowieso die Liste, und so spar ich mir nen FunktionsaufrufEyDu hat geschrieben:Das ist wirklich Eleganz auf ganz hohem Niveau
Aber wenn du imap schon importierst, dann musst du es schon ausnutzen:
Code: Alles auswählen
list(imap(call, imap(operator.attrgetter('split'), l)))
Code: Alles auswählen
from itertools import imap
import operator
l = ['foo bar fooooobar', 'bar foo foobar']
call = lambda f: f()
def test():
return map(call, imap(operator.attrgetter('split'), l))
def calltest():
return [f() for f in imap(operator.attrgetter('split'), l)]
def lctest():
return [line.split() for line in l]
def gctest():
return list(line.split() for line in l)
if __name__=='__main__':
from timeit import Timer
for func in ['test', 'calltest', 'lctest', 'gctest']:
t = Timer("%s()" % func, "from __main__ import %s" % func)
print "Function %s took %fs" % (func, t.timeit())
Ich schließe daraus, dass wir dringend operator.call in der stdlib brauchenFunction test took 11.511894s
Function calltest took 5.119288s
Function lctest took 3.460341s
Function gctest took 9.458675s
Code: Alles auswählen
def mctest():
return map(methodcaller('split'), l)
Code: Alles auswählen
datei = file('F:\Test.txt','r')
daten = str(datei.read()) #nimmt den Zeilenumbruch nicht mit
datei.close()
liste = daten.split("\n") # das ist der Zeilenumbruch, fungiert als
# Trennungsmarke
for e in range(len(liste)):
woerter = liste[e].split(" - ")
print 'woerter:'
print woerter
d1 = {woerter[0]:woerter[1]} #w0 = Interpret / w1 = Titel
d2 = {woerter[1]:woerter[0]}
print 'd1: '
print d1
print 'd2: '
print d2
Aber ich versteh ned wieso. Angesprochen wird immer das erste und das zweite Element der Liste. Ich erhalte 4 Listen, warum erreicht nur eine das dict? Ich dachte erst es liegt daran, das dict-Zeilen nicht eingerückt sind, aber Fehlanzeige. Kann es sein, das ein dictionary-Einträge jedesmal überschrieben werden?woerter:
['Linkin Park', 'No Roads Left']
woerter:
['SUM41', 'Summer']
woerter:
['Yellowcard', 'Takedown']
woerter:
['Yellowcard', 'Fighting']
d1:
{'Yellowcard': 'Fighting'}
d2:
{'Fighting': 'Yellowcard'}
Code: Alles auswählen
d1 = {}
d2 = {}
for e in range(len(liste)):
woerter = liste[e].split(" - ")
print 'woerter:'
print woerter
d1[woerter[0]] = woerter[1] #w0 = Interpret / w1 = Titel
d2[woerter[1]] = woerter[0]
Zef*x, jetzt fehlt bei d1 aber wieder ein Element...woerter:
['Linkin Park', 'No Roads Left']
woerter:
['SUM41', 'Summer']
woerter:
['Yellowcard', 'Takedown']
woerter:
['Yellowcard', 'Fighting']
d1:
{'Linkin Park': 'No Roads Left', 'SUM41': 'Summer', 'Yellowcard': 'Fighting'}
d2:
{'Summer': 'SUM41', 'Fighting': 'Yellowcard', 'Takedown': 'Yellowcard', 'No Roads Left': 'Linkin Park'}
Code: Alles auswählen
pairs = {}
for line in liste:
artist, title = line.split(' - ')
# wenn artist noch nicht im dict ist,
# lege eine neue liste an und hänge dort title an
# wenn er schon im dict ist -> hänge an
pairs[artist] = pairs.get(artist, []) + [title]
# oder hier, etwas einfacher:
from collections import defaultdict
pairs = defaultdict(list)
for line in liste:
artist, title = line.split(' - ')
pairs[artist].append(title)
Code: Alles auswählen
In [1]: foo = range(5)
In [2]: print foo
[0, 1, 2, 3, 4]
In [3]: zero, one, two, three, four = foo
In [4]: print zero
0
In [5]: print one
1
Code: Alles auswählen
>>> from operator import itemgetter
>>> from itertools import groupby
>>> l = [(1,"a"), (2,"b"), (1,"c")]
>>> dict((k, map(itemgetter(1), g)) for k, g in groupby(sorted(l), itemgetter(0)))
{1: ['a', 'c'], 2: ['b']}
>>>