Sono un programmatore PHP abbastanza comodo e ho pochissima esperienza in Python. Sto cercando di aiutare un amico con il suo progetto, il codice è abbastanza facile da scrivere in PHP, ne ho trasferito la maggior parte, ma ho bisogno di un po 'di aiuto per completare la traduzione, se possibile. L'obiettivo è quello di:Fare il salto da PhP a Python
- generare un elenco di oggetti di base con
- selezionato casualmente alcuni elementi di uid per creare un secondo elenco calettato l'uid contenente nuove proprietà.
- Test per gli incroci tra i due elenchi per modificare di conseguenza la risposta.
Il seguente è un esempio di lavoro di quello che sto cercando di codice in Python
<?php
srand(3234);
class Object{ // Basic item description
public $x =null;
public $y =null;
public $name =null;
public $uid =null;
}
class Trace{ // Used to update status or move position
# public $x =null;
# public $y =null;
# public $floor =null;
public $display =null; // Currently all we care about is controlling display
}
##########################################################
$objects = array();
$dirtyItems = array();
#CREATION OF ITEMS########################################
for($i = 0; $i < 10; $i++){
$objects[] = new Object();
$objects[$i]->uid = rand();
$objects[$i]->x = rand(1,30);
$objects[$i]->y = rand(1,30);
$objects[$i]->name = "Item$i";
}
##########################################################
#RANDOM ITEM REMOVAL######################################
foreach($objects as $item)
if(rand(1,10) <= 2){ // Simulate full code with 20% chance to remove an item.
$derp = new Trace();
$derp->display = false;
$dirtyItems[$item->uid] = $derp; //# <- THIS IS WHERE I NEED THE PYTHON HELP
}
##########################################################
display();
function display(){
global $objects, $dirtyItems;
foreach($objects as $key => $value){ // Iterate object list
if(@is_null($dirtyItems[$value->uid])) // Print description
echo "<br />$value->name is at ($value->x, $value->y) ";
else // or Skip if on second list.
echo "<br />Player took item $value->uid";
}
}
?>
Quindi, in realtà ho la maggior parte di esso ordinato Sto solo avendo difficoltà con la versione di Python di un array associativo, per avere una lista le cui chiavi corrispondono al numero Unico di Articoli nell'elenco principale.
L'output del codice di cui sopra dovrebbe essere simile a:
Player took item 27955
Player took item 20718
Player took item 10277
Item3 is at (8, 4)
Item4 is at (11, 13)
Item5 is at (3, 15)
Item6 is at (20, 5)
Item7 is at (24, 25)
Item8 is at (12, 13)
Player took item 30326
mie competenze Python sono ancora certo, ma questo è più o meno lo stesso blocco di codice come sopra. Ho cercato e utilizzo le funzioni di elenco .insert() o .setitem() ma non funziona come previsto.
Questo è il mio codice Python corrente, non ancora pienamente funzionale
import random
import math
# Begin New Globals
dirtyItems = {} # This is where we store the object info
class SimpleClass: # This is what we store the object info as
pass
# End New Globals
# Existing deffinitions
objects = []
class Object:
def __init__(self,x,y,name,uid):
self.x = x # X and Y positioning
self.y = y #
self.name = name #What will display on a 'look' command.
self.uid = uid
def do_items():
global dirtyItems, objects
for count in xrange(10):
X=random.randrange(1,20)
Y=random.randrange(1,20)
UID = int(math.floor(random.random()*10000))
item = Object(X,Y,'Item'+str(count),UID)
try: #This is the new part, we defined the item, now we see if the player has moved it
if dirtyItems[UID]:
print 'Player took ', UID
except KeyError:
objects.append(item) # Back to existing code after this
pass # Any error generated attempting to access means that the item is untouched by the player.
# place_items()
random.seed(1234)
do_items()
for key in objects:
print "%s at %s %s." % (key.name, key.x, key.y)
if random.randint(1, 10) <= 1:
print key.name, 'should be missing below'
x = SimpleClass()
x.display = False
dirtyItems[key.uid]=x
print ' '
objects = []
random.seed(1234)
do_items()
for key in objects:
print "%s at %s %s." % (key.name, key.x, key.y)
print 'Done.'
Quindi, mi dispiace per il lungo post, ma volevo essere tutto e per fornire entrambi i set di codice completo. Il PhP funziona perfettamente, e il Python è vicino. Se qualcuno può indicarmi la direzione giusta sarebbe un grande aiuto. dirtyItems.insert (key.uid, x) è quello che provato ad utilizzare per far funzionare elenco come array Assoc
Edit: piccola correzione.
tenta di utilizzare '' dirtyItems' come dict' invece di 'list'. È possibile inserire una coppia di valori chiave come "dirtyItems [chiave] = valore" – Netro
Questo è fantastico, ho funzionato ora grazie, penso che sia esilarante che fondamentalmente l'estensione del cambiamento consistesse in ** commutazione da [] a {} ** e alcune altre correzioni minori. Ora posso avere questo integrato nel progetto principale per la prossima versione. – Toaster
Se stai facendo cose come set intersecanti allora dovresti rendere gli oggetti [hashable] (http://docs.python.org/2/reference/datamodel.html#object.__hash__) in modo che possano partecipare a ' set'. –