[Python] Lista dizionari

2012-06-15 Per discussione Walter Valenti
Correzione dalla mail precedente senza titolo:



Ho il seguente problema:

una lista dizionari siffati:
tabella{path,cfile}
Nella lista il valore della chiave path può essere ripetuto n volte.
Come faccio a tirate fuori nella maniera più efficiente possibile (!!!) tutte  
le 
coppie path,cfile
per un dato valore della chiave di path ?

Grazie
Walter
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Lista dizionari

2012-06-15 Per discussione stefano bossi
Non è che invece intende una lista di dizionari con 2 chiavi?

tabella = [{path:'blabla', cfile:'nomedelfile'}, {path:'blabla',
cfile:'nomedelfile'}]

2012/6/15 Daniele Zambelli daniele.zambe...@gmail.com

 Il 15 giugno 2012 12:39, Walter Valenti waltervale...@yahoo.it ha
 scritto:
  Correzione dalla mail precedente senza titolo:
 
 
 
  Ho il seguente problema:
 
  una lista dizionari siffati:
  tabella{path,cfile}
  Nella lista il valore della chiave path può essere ripetuto n volte.
  Come faccio a tirate fuori nella maniera più efficiente possibile (!!!)
 tutte  le
  coppie path,cfile

 Il problema non è tirar fuori, è mettere dentro elementi con
 chiave ripetuta:

  d={'a': 4, 'b': 6, 'a': 3}
  d
 {'a': 3, 'b': 6}

 Ciao

 --

 Daniele

 www.fugamatematica.blogspot.com

 giusto!
 nel verso
 forse è perché non guardiamo le cose
 Quando non ci capiamo,
 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Lista dizionari

2012-06-15 Per discussione Giuseppe Amato
Puoi creare una classe che implementi un dizionario di ricerca qualcosa del
tipo:

class MyList:
  def __init__(self):
tabella={}
cfiles={}

  def put(path,cfile):
tabella[path]=cfile;
if cfiles.has_key(path):
   cfiles[path].append(cfile)
else:
   cfiles[path]=[cfile]

A questo punto potresti non avere più bisogno di tabella

PS: spero di non aver scritto castronerie visto che adesso sto programmando
in java per android :)

Il giorno 15 giugno 2012 12:56, stefano bossi ste.bo...@gmail.com ha
scritto:

 Non è che invece intende una lista di dizionari con 2 chiavi?

 tabella = [{path:'blabla', cfile:'nomedelfile'}, {path:'blabla',
 cfile:'nomedelfile'}]



-- 
--
Giuseppe Amato
e-mail: giuam...@gmail.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Lista dizionari

2012-06-15 Per discussione Daniele Varrazzo

On Fri, 15 Jun 2012 11:39:13 +0100 (BST), Walter Valenti wrote:

Correzione dalla mail precedente senza titolo:



Ho il seguente problema:

una lista dizionari siffati:
tabella{path,cfile}
Nella lista il valore della chiave path può essere ripetuto n 
volte.

Come faccio a tirate fuori nella maniera più efficiente possibile
(!!!) tutte  le
coppie path,cfile
per un dato valore della chiave di path ?


Come ti hanno detto in molti, puoi avere solo chiavi singole in un 
dizionario. Ma puoi avere valori multipli se li metti in una lista. Il 
modo più idiomatico credo sia questo:



In [1]: from collections import defaultdict

In [4]: d = defaultdict(list)

In [5]: d['foo'].append(10)

In [6]: d['foo'].append(20)

In [7]: d['bar'].append(30)

In [8]: d
Out[8]: defaultdict(type 'list', {'foo': [10, 20], 'bar': [30]})

Puoi iterare facilmente su chiavi e valori:

In [10]: for k, v in d.iteritems():
for x in v:
print k, x
   :
   :
foo 10
foo 20
bar 30

Puoi tirare fuori tutti i valori per una chiave ripetuta:

In [9]: d['foo']
Out[9]: [10, 20]

O solo il primo se sei assumi ce ne sia solo uno:

In [10]: d['bar'][0]
Out[10]: 30


--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Lista dizionari

2012-06-15 Per discussione Walter Valenti




 Da: stefano bossi ste.bo...@gmail.com
A: daniele.zambe...@gmail.com; Discussioni generali sul linguaggio Python 
python@lists.python.it 
Inviato: Venerdì 15 Giugno 2012 12:56
Oggetto: Re: [Python] Lista dizionari
 

Non è che invece intende una lista di dizionari con 2 chiavi?


tabella = [{path:'blabla', cfile:'nomedelfile'}, {path:'blabla', 
cfile:'nomedelfile'}]

Sì, infatti ho riscritto la mail.

Walter

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Lista dizionari

2012-06-15 Per discussione Stefano Dal Pra
Non so se ho capito, ma se hai una lista

L = [{path:'path1',cfile:'file1'}, ... , {path:'pathn',cfile:'filen'}]

puoi provare una cosa del genere:

keypath = '/un/certo/path'
[(d[path],d[cfile]) for d in  L if d[path] = keypath]


Stefano

2012/6/15 Walter Valenti waltervale...@yahoo.it




 
  Da: stefano bossi ste.bo...@gmail.com
 A: daniele.zambe...@gmail.com; Discussioni generali sul linguaggio
 Python python@lists.python.it
 Inviato: Venerdì 15 Giugno 2012 12:56
 Oggetto: Re: [Python] Lista dizionari
 
 
 Non è che invece intende una lista di dizionari con 2 chiavi?
 
 
 tabella = [{path:'blabla', cfile:'nomedelfile'}, {path:'blabla',
 cfile:'nomedelfile'}]

 Sì, infatti ho riscritto la mail.

 Walter

 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Lista dizionari

2012-06-15 Per discussione Walter Valenti



Non so se ho capito, ma se hai una lista

L = [{path:'path1',cfile:'file1'}, ... , {path:'pathn',cfile:'filen'}]

puoi provare una cosa del genere:

keypath = '/un/certo/path'
[(d[path],d[cfile]) for d in  L if d[path] = keypath]



E' quello che faccio anche io. Itero sul dizionario.
Speravo ci fosse un modo diverso (con dizionari grandi e con tanti keypath fa 
verificare
diventa oneroso.

In pratica per ogni dizionario della lista verifica che dizio['path'] sia nella 
lista dei valori da verificare.:

for x in lista_valore:
    if x['path'] in lista_inter:

   ### resto del codice

dove lista_valore è la lista dei dizionari
lista_inter è la lista dei valori da verificare


Walter
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Lista dizionari

2012-06-15 Per discussione Marco Beri
2012/6/15 Walter Valenti waltervale...@yahoo.it

 E' quello che faccio anche io. Itero sul dizionario.
 Speravo ci fosse un modo diverso (con dizionari grandi e con tanti keypath
 fa verificare
 diventa oneroso.

In pratica per ogni dizionario della lista verifica che dizio['path'] sia
 nella lista dei valori da verificare.:

 for x in lista_valore:
 if x['path'] in lista_inter:

### resto del codice


 dove lista_valore è la lista dei dizionari
 lista_inter è la lista dei valori da verificare


Se vuoi qualcosa di più efficiente ti devi costruire un dizionario
inverso durante la costruzione dei dizionari normali, dove le chiavi sono
i path e il valore sono la lista di dizionari che li contengono.

Il tuo codice seguente:

for x in lista_valore:
if x['path'] in lista_inter:
### resto del codice

Diventerebbe:
for x in lista_valore_inverso['path']:
### resto del codice

In realtà non sono sicuro di cosa siano lista_valore e lista_inter, ma
spero di essermi spiegato.

Ciao.
Marco.

-- 
http://beri.it/ - Un blog
http://beri.it/i-miei-libri/ - Qualche libro
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Lista dizionari

2012-06-15 Per discussione Matteo Boscolo
dalle varie letture che ho fatto sembra che il metodo get del 
diziopnario dict.get('key',False) ...sia più spiccio se devi leggere 
il valore .. magari aiuta ...


ciao
Matteo

Il 15/06/2012 14:17, Walter Valenti ha scritto:



Non so se ho capito, ma se hai una lista

L = [{path:'path1',cfile:'file1'}, ... , {path:'pathn',cfile:'filen'}]

puoi provare una cosa del genere:

keypath = '/un/certo/path'
[(d[path],d[cfile]) for d in  L if d[path] = keypath]



E' quello che faccio anche io. Itero sul dizionario.
Speravo ci fosse un modo diverso (con dizionari grandi e con tanti keypath fa 
verificare
diventa oneroso.

In pratica per ogni dizionario della lista verifica che dizio['path'] sia nella 
lista dei valori da verificare.:

for x in lista_valore:
 if x['path'] in lista_inter:

### resto del codice

dove lista_valore è la lista dei dizionari
lista_inter è la lista dei valori da verificare


Walter
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python



___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python