Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Post - nuzzopippo

Pagine: [1] 2 3 ... 6
1
Esercizi / Re:Rimozione doppi caratteri stringa
« il: Settembre 17, 2019, 09:49 »
...
non capisco però questa riga di codice:
>>> ''.join(sorted(set(var), key=var.index))

...Presumo allora sia l'indirizzo d'inizio stringa.
Potreste spiegarmi ?

Pur con tutti i dubbi derivanti dalla mia ignoranza dell'inglese, cercherò di spiegare quello che ho capito io.
la funzione builtin "sorted" ha vari parametri possibili :
>>> help('sorted')
Help on built-in function sorted in module builtins:

sorted(iterable, /, *, key=None, reverse=False)
    Return a new list containing all items from the iterable in ascending order.
   
    A custom key function can be supplied to customize the sort order, and the
    reverse flag can be set to request the result in descending order.

>>>

in particolare, il parametro, non obbligatorio, key definisce una funzione da utilizzarsi per ordinare gli elementi dell'oggetto iterabile passato quale primo parametro.
Nello specifico, il metodo index delle stringhe che restituisce la posizione del singolo carattere nella stringa da utilizzarsi quale criterio di ordinamento.
[Edit]Avevo omesso di dirlo : ovviamento è sorted che si fa carico di applicare la funzione ai singoli elementi dello iterabile, definendone l'ordine.
Nel caso di 'str.index(substr)' è il primo apparire del caattere nella stringa, il che va benissimo nel caso in esame[/Edit]
Quando omesso, vengono utilizzati i metodi standard previsti per l'oggetto da esaminarsi (p.e., alfabetico per oggetti stringa) ammesso che l'oggetto lo definisca,

Ne consegue che non necessariamente l'ordinamento risultante sia quello canonico per l'oggetto in esame, p.e. supposta una lista di stringhe :
>>> lista = ['d', 'ccc', 'aaa', 'bbbb', 'ee']
>>> sorted(lista)
['aaa', 'bbbb', 'ccc', 'd', 'ee']
>>>


volendola ordinare per la lunghezza delle stringhe potremmo utilizzare la funzione bultin "len() quale chiave di ordinamento
>>> sorted(lista, key=len)
['d', 'ee', 'ccc', 'aaa', 'bbbb']
>>>

ed è anche possibile utilizzare funzioni "personalizzate".

Come detto in precedenza, non necessariamente gli elementi costituenti un iterabile, tipo una lista, possiedono un criterio di ordinamento, potrebbero essere, p.e., oggetti definiti dall'utente senza definizione di criteri di comparazione, letta la Tua domanda mi son divertito a prepararti un esempio basato sui dizionari (oltre che prematuro, temo, sarebbe lungo un esempio sugli oggetti utente), posto di avere questo elenco di nomi
Paolino;Paperino
De Paperoni;Paperone
Gastone;Paperone
De Paperis;Pico
Pitagorico;Archimede

da inserirsi in una lista di paperi
>>> import os
>>> os.chdir('/media/nuzzo/progetti/digila/sorted')
>>> paperi = []
>>> f = open('nomi', 'r')
>>> for riga in f.read().splitlines():
nome = {}
data = riga.split(';')
nome['cogn'] = data[0]
nome['nome'] = data[1]
paperi.append(nome)


>>> f.close()
>>> for elem in paperi:
print(elem)


{'cogn': 'Paolino', 'nome': 'Paperino'}
{'cogn': 'De Paperoni', 'nome': 'Paperone'}
{'cogn': 'Gastone', 'nome': 'Paperone'}
{'cogn': 'De Paperis', 'nome': 'Pico'}
{'cogn': 'Pitagorico', 'nome': 'Archimede'}
>>>

la lista sarà ordinata secondo l'ordine di inserimento, se noi volessimo "ordinarla" non potremmo farlo direttamente :
>>> sorted(paperi)
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    sorted(paperi)
TypeError: '<' not supported between instances of 'dict' and 'dict'
>>>

Perché sorted non conosce il criterio di ordinamento di una serie di dizionari, dovremmo dirglielo noi. Potremmo ordinare un dizionario per chiave o valore, una lista di dizionari non ha molto senso ordinata per chiave, diciamo che vogliamo ordinarla per valore, sia il cognome od il nome, potremmo fare :
>>> for elem in sorted(paperi, key=lambda e: e['cogn']):
print(elem)


{'cogn': 'De Paperis', 'nome': 'Pico'}
{'cogn': 'De Paperoni', 'nome': 'Paperone'}
{'cogn': 'Gastone', 'nome': 'Paperone'}
{'cogn': 'Paolino', 'nome': 'Paperino'}
{'cogn': 'Pitagorico', 'nome': 'Archimede'}
>>> for elem in sorted(paperi, key=lambda e: e['nome']):
print(elem)


{'cogn': 'Pitagorico', 'nome': 'Archimede'}
{'cogn': 'Paolino', 'nome': 'Paperino'}
{'cogn': 'De Paperoni', 'nome': 'Paperone'}
{'cogn': 'Gastone', 'nome': 'Paperone'}
{'cogn': 'De Paperis', 'nome': 'Pico'}
>>>

In questo caso ho utilizzato una funzione lambda, sono possibili altre metodologie.

Spero Ti sia sufficiente :)

2
Esercizi / Re:Rimozione doppi caratteri stringa
« il: Settembre 16, 2019, 15:35 »
Pero' qua tu stai ri-ordinando la stringa finale con un ordinamento che potrebbe essere diverso dall'ordine originale.

Ossia, due stringhe in input con caratteri ordinati differentemente producono lo stesso output:
>>> var = '1111122222casa     gino èèèèùùùùçç@@@'
>>> ''.join(sorted(set(var), key=var.index))
'12cas ginoèùç@'

>>> var2 = '22222casa11     gino èèèèùùùùçç@@@'
>>> ''.join(sorted(set(var2), key=var.index))
'12cas ginoèùç@'


@bebo, ritengo l'intervento in citazione una svista, dato che è banale che volendo mantenere l'ordinamento di una variabile sarà l'indice di quest'ultima e non di un'altra la chiave di ordinamento.
In tal senso l'esempio in citazione avrebbe dovuto essere :
>>> var = '1111122222casa     gino èèèèùùùùçç@@@'
>>> ''.join(sorted(set(var), key=var.index))
'12cas ginoèùç@'
>>> var2 = '22222casa11     gino èèèèùùùùçç@@@'
>>> ''.join(sorted(set(var2), key=var2.index))
'2cas1 ginoèùç@'
>>>


Ovviamente, è possibile Tu intenda qualcos'altro che non ho compreso, in tal caso sono tutto orecchi

3
Esercizi / Re:Rimozione doppi caratteri stringa
« il: Settembre 14, 2019, 10:42 »
beh ... set() era stato usato nel primo esempio posto, mi sembrava evidente si volesse un elenco "indicizzato" dei caratteri.

Per altro, ho trovato molto "intrigante" il link proposto da @bebo, in particolare, sempre sotto l'aspetto "carattere unico indicizzato" il metodo:
>>> var = '1111122222casa     gino èèèèùùùùçç@@@'
>>> ''.join(sorted(set(var), key=var.index))
'12cas ginoèùç@'
>>>

per il quale possedevo tutte le nozioni necessarie ma che non mi ha sfiorato la mente ma anche altre soluzioni sono "interessanti".

 ... l'utilità di fondo di tal genere di discussioni : aprono gli occhi :)

4
Esercizi / Re:Rimozione doppi caratteri stringa
« il: Settembre 10, 2019, 10:48 »
Ciao @gila

 ... come al solito mi affascina vedere schemi di pensiero diversi dai miei, in particolare il metodo con lista marcata non lo avrei mai pensato, lo devo guardar bene per capire la tecnica ;)

Lungi da me l'idea indicare metodi "più pythonici" che delego ai molti utenti più capaci che ci sono in giro, se interessati a rispondere, io avrei più banalmente fatto :
>>> def uni_car(old_str):
tmp = []
for i in range(len(old_str)):
if not old_str[i] in tmp:
tmp.append(old_str[i])
return ''.join(tmp)

>>> uni_car('casa xx 1123')
'cas x123'
>>> uni_car('xxxxxxxxxxxxxxxxx 123     56')
'x 12356'
>>> uni_car('1111122222casa     gino èèèèùùùùçç@@@')
'12cas ginoèùç@'
>>>


... il codice della funzione da me proposta si presterebbe, con piccole variazioni, anche alla eliminazione dei soli caratteri "consecutivamente uguali",  in questo modo:
>>> def cons_car(old_str):
tmp = []
for i in range(len(old_str) - 1):
if old_str[i] != old_str[i+1]:
tmp.append(old_str[i])
tmp.append(old_str[-1])
return ''.join(tmp)

>>> cons_car('casa xx 1123')
'casa x 123'
>>> cons_car('xxxxxxxxxxxxxxxxx 123     56')
'x 123 56'
>>> cons_car('1111122222casa     gino èèèèùùùùçç@@@')
'12casa gino èùç@'
>>>

5
Benvenuto e regolamento / Re:Mi presento
« il: Settembre 08, 2019, 20:06 »
Ciao @gila, piacere di leggeri anche qui  :)

6
Benvenuto e regolamento / Re:Ciao a tutt*! :)
« il: Agosto 29, 2019, 13:24 »
Benvenuta :)

7
Benvenuto e regolamento / Re:Salute a tutti
« il: Agosto 29, 2019, 13:20 »
I miei saluti, buona "ripresa" :)

8
Benvenuto e regolamento / Re:Presentazione
« il: Agosto 29, 2019, 13:19 »
Ciao Beppe, benvenuto :)

9
Base / Re:Orientarsi nelle cartelle
« il: Agosto 15, 2019, 09:33 »
Ciao, ho letto ieri questo post ma non avevo tempo per rispondere, è facile Tu abbia già risolto, dato il tempo trascorso, comunque ...

Molto dipende da cosa tu voglia fare e come intendi operare con le immagini contenute nelle sotto-cartelle della directory contenente la Tua applicazione, mettiamo tu voglia solo stampare i file presenti nelle cartelle delle tipologie che Tu intendi gestire (non tutti i tipi sono facilmente gestibili con python), potresti rilevarli tramite le "estensioni" dei nomi dei files e ciclare tra i nomi, sotto una simulazione in merito:
>>> import os
>>> names = ['risorse', 'risorse/icone']
>>> ext = ['png', 'jpg']
>>> for n in names:
print('esame directory', n)
files = os.listdir(n)
if files:
for f in files:
if f.split('.')[-1] in ext:
print(' - ', f)
else:
print(' - ')
print()


esame directory risorse
 -  04.jpg
 -  06.jpg
 -  07.jpg
 -  08.jpg
 -  09.jpg
 -  10.jpg
 -  12.jpg
 -  05.jpg
 -  03.png
 -  01.jpg
 -  02.jpg
 -  b11.jpg

esame directory risorse/icone
 -  format-text-bold.png
 -  format-text-italic.png
 -  format-text-strikethrough.png
 -  format-text-underline.png

>>>

Come puoi vedere, mi sono limitato a definire un paio di possibili estensioni nella lista ext e stampare a video i soli files che presentino nel nome una estensione compatibile.

Il metodo sopra funzionerebbe solo se si lanci un eventuale script posizionati nella direttrice che lo contiene, lanciandolo da directory diversa si avrebbe errore nel rilevare i files. Per ovviare alla faccenda puoi importare il modulo "sys" (oltre os) e sfruttare gli argomenti di lancio dello script per ricavarti la direttrice contenente lo script ed utilizzarla per le tue interrogazioni, in questo modo:
>>> import sys
>>> os.path.abspath(os.path.dirname(sys.argv[0]))
'/media/nuzzo/progetti/fotodiario'
>>> cp = os.path.abspath(os.path.dirname(sys.argv[0]))
>>> for n in names:
print('esame directory', n)
files = os.listdir(os.path.join(cp, n))
...


Tieni ben presente il metodo "os.path.join(...)", ti sarà utile nel caso Tu voglia "operare" sui file rilevati.

Ovviamente, ci sono molti altri modi con cui approcciarsi, magari più efficaci e magari più complessi ma tutto dipende da cosa vuoi fare e come.

Ciao :)

10
Esercizi / Re:collatz dubbio
« il: Agosto 14, 2019, 09:07 »
ti ringrazio per la soluzione anche se c'è qualche passaggio che devo capire meglio

Forse, il passaggio che Ti lascia dubbi è questa istruzione?
 ', '.join(lst[:-1] + ['infine'] + [lst[-1]])


Si tratta della effettuazione di uno join su di una lista composta sommando porzioni della lista originaria con un inserto di una lista composta da un singolo elemento. Sono metodi di base delle liste, forse non li hai ancora affrontati, purtroppo è difficile intuire quali sono le Tue conoscenze al momento, se Ti occorrono notizie in merito a tale operazione, guarda questa pagina,, il punto 8.7 in particolare, ma senza fretta segui coerentemente il Tuo percorso,

Giusto per Tua informazione ma solo per sapere, avanzando nella comprensione del linguaggio scoprirai l'esistenza di metodi più avanzati che permetterebbero ulteriori cose, non approfondire al momento ma, p.e., tutta la funzione potrebbe essere ridotta in una sola istruzione, combinando le " list comprehension" alla precedente istruzione, vedi già :

>>> lista = ['mele', 'banane', 'tofu', 'gatti']
>>> ', '.join([str(x) for x in lista][:-1] + ['infine'] + [[str(x) for x in lista][-1]])
'mele, banane, tofu, infine, gatti'
>>>


Ciao, e buon strudio :)

11
Ho dato un'occhiata al codice C del modulo.
...
Tieni conto che comunque è un'indagine di massima.

Grazie della risposta @GlennHK, ho dato una rapida occhiata da quanto da Te segnalato e ve ne è di roba da vedere, in effetti, le complessità stessa dell'argomento (Layer OSI e protocollo TCP-IP) è proibitiva circa approfondimenti puntuali in una sede quale un post.
Mi consola che "bene o male" la Tua indagine all'incirca confermi quanto intuito ed esposto nel mio precedente post.

Per altro, nelle descrizioni di varia documentazione reperita, si trova :
Citazione
AF_PACKET — low-level packet receiving interface.
che è una ulteriore conferma si stia sulla giusta strada.

Va da se che ulteriori approfondimenti occorrano prima di utilizzare "operativamente" quanto esposto ma le Tue indicazioni sono utili in proposito, grazie ancora :)

12
... beh, lo so che quanto sopra non è un argomento che interessi molto. Comunque, nel caso a qualcuno possa interessare, mi sono accorto di un particolare che non si evince dalla documentazione da me trovata e che dovrò testare su sistemi e s.o. diversi dal mio, per verificarne l'utilità.

Il particolare è questo : tutte le interfacce di rete rilevate tramite netifaces.interfaces() hanno una chiave "17" presente nel dizionario restituito da "netifaces.ifaddresses(scheda)", tale chiave corrisponde alla costante "netifaces.AF_PACKET", della quale non ho trovato uno straccio di documentazione che mi indichi cosa sia ma nella cui lista di dizionari, alla chiave 'addr', contiene il MAC della scheda di rete fisica corrispondente, mentre i valori sono nulli per l'interfaccia di loopback.
Ciò permetterebbe di limitare le ricognizioni da effettuare nella LAN locale agli indirizzi IPv4 che presentino dei mac valorizzati e connessioni IP del tipo voluto, estraendole con un codice del genere :

>>> import netifaces as ni
>>> nif = ni.interfaces()
>>> for scheda in nif:
diz_ind = ni.ifaddresses(scheda)
passed = False
if ni.AF_PACKET in diz_ind.keys():
mac_addr = diz_ind[ni.AF_PACKET][0]['addr']
for elem in mac_addr.split(':'):
if elem != '00':
passed = True
break
if passed:
print('Scheda', scheda,
      '- MAC addr. :', diz_ind[ni.AF_PACKET][0]['addr'])
if ni.AF_INET in diz_ind.keys():
for ind in diz_ind[ni.AF_INET]:
print('Indirizzo IP :', ind['addr'])
else:
print('Scheda', scheda, 'non ha indirizzo fisico')
print()


Scheda lo non ha indirizzo fisico

Scheda enp2s0 - MAC addr. : a0:d3:c1:3d:7e:32
Indirizzo IP : 192.168.60.28

>>>


Certamente, potrei anche essere in errore, il mio capire poco e nulla dell'inglese è micidiale e spesso mi fa prendere cantonate.

13
Esercizi / Re:collatz dubbio
« il: Agosto 08, 2019, 08:53 »
ciao Nuzzo

ti ridisturbo...

ma non sono convinto sia esatto...che mi suggerisci?

Il suggerimento più importante che posso darTi è questo : ragiona bene sul problema, schematizza i passi da fare e risolvilo.

Solo in questo modo imparerai qualcosa, la soluzione fornita da altri la dimenticherai subito.

Comunque, non è bene :
1° inserire un "nuovo" problema in un post già "superato;
2° rivolgersi ad uno specifico utente di un Forum ... questo è un ambiente collaborativo e si collabora un po' tutti mettendo a disposizione ciò che si conosce (oltre tutto io sono uno dei componenti più scarsi).

Detto questo, che non vuole essere un rimprovero ma solo chiarirTi come è bene procedere nell'interesse di tutti (non tutti conosciamo la netiquette dell'ambiente, leggi il regolamento in proposito), passiamo ad esaminare il problema posto ragionando per passi.

il primo dei parametri richiesti è :
Citazione
scrivete una funzione che prenda un valore lista come argomento e restituisca una stringa con ...

Quindi, la funzione non deve fare altro che restituire gli elementi componenti la lista separati da virgola e spazio, nel caso gli elementi della lista è faccenda semplice, si può utilizzare la funzione "join" delle stringhe (cerca e leggi la docs) in questo modo :
>>> def dai_stringa(lst):
return ', '.join(lst[:-1] + ['infine'] + [lst[-1]])

>>> lista = ['mele', 'banane', 'tofu', 'gatti']
>>> stringa = dai_stringa(lista)
>>> print(stringa)
mele, banane, tofu, infine, gatti
>>>


Come noterai, ho usato "pesantemente" i metodi delle liste, che suppongo sia l'obiettivo dell'esercizio (scolastico?) ... se non li conosci trova leggi attentamente la docs, è una attività propedeutica e necessaria per imparare.

... ma vi è la seconda delle condizioni poste :
Citazione
La vostra funzione però deve poter funzionare con qualsiasi valore lista le sia passato.
la funzione "dai_stringa" non funzionerebbe se nella lista passata quale paramentro vi fosse, ad esempio, un valore numerico od un oggetto "non stringa" qualsiasi ... ci può venire in aiuto la funzione built-in "str()" (trova e leggi la docs), convertendo tutti i valori della lista "parametro" in stringhe organizzate in una nuova lista e lavorare quest'ultima, p.e. così :
>>> def dai_stringa(lst):
my_lst = []
for elem in lst:
my_lst.append(str(elem))
return ', '.join(my_lst[:-1] + ['infine'] + [my_lst[-1]])

>>> lista = ['mele', 1, 'banane', 'tofu', 'gatti', 2]
>>> stringa = dai_stringa(lista)
>>> print(stringa)
mele, 1, banane, tofu, gatti, infine, 2


Se Tu avessi applicato la lista di questo secondo esempio con la funzione definita nel primo avresti avuto un errore
Citazione
TypeError: sequence item 1: expected str instance, int found

Ciao

14
I miei saluti.

Per una "trasformazione" della lan locale, da IP statici definiti localmente a DHCP non controllabile localmente, mi sto ponendo domande su come individuare alcuni server in lan locale (database, ftp, ssh etc.) in un ambiente ad IP variabili.

La soluzione più immediata che mi è venuta in mente è individuare gli indirizzi tcp-ip locali alla macchina e poi fare una scansione del range 1 - 254 della sotto-rete locale per vedere su quali indirizzi le porte dei server sono aperte ed in ascolto.

Individuare gli indirizzi IP locali alla macchina mi è riuscito utilizzando il modulo "netifaces", in questo modo :
>>> import netifaces as ni
>>> nif = ni.interfaces()
>>> for scheda in nif:
print('Interfaccia :', scheda)
diz_ind = ni.ifaddresses(scheda)
for chiave in diz_ind.keys():
if chiave == 2:
print('%3s' % chiave, diz_ind[chiave])
print()


Interfaccia : lo
  2 [{'addr': '127.0.0.1', 'netmask': '255.0.0.0', 'peer': '127.0.0.1'}]

Interfaccia : enp2s0
  2 [{'addr': '192.168.60.28', 'netmask': '255.255.255.0', 'broadcast': '192.168.60.255'}]

>>>


Ma vorrei limitare le scansioni alle sole schede "fisiche" presenti nel sistema, evitando interfacce di loobpack e virtuali, è un po' che cerco nella documentazione ma non mi riesce di individuare niente di utile in merito a come effettuare una tale distinzione, avreste delle indicazioni da darmi in proposito?

Grazie dell'attenzione :)

15
Esercizi / Re:collatz dubbio
« il: Agosto 05, 2019, 09:32 »
Le parentesi attorno alla condizione dell'if sono inutili. Python non è java.

Verissimo ed hai fatto bene a segnalarlo :)

Sfuggite senza che neanche me ne rendessi conto (in questo periodo sto aggiornando del vecchio codice, java appunto) ... anche se a dire il vero a volte le uso apposta anche in python, per aiutarmi nella "logica", male non fanno ma è comunque bene non mettere "personalizzazioni".

Ciao

Pagine: [1] 2 3 ... 6