2012-12-24 6 views
5

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.

+0

tenta di utilizzare '' dirtyItems' come dict' invece di 'list'. È possibile inserire una coppia di valori chiave come "dirtyItems [chiave] = valore" – Netro

+0

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

+0

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'. –

risposta

2

Stai dichiarando dirtyItems come una matrice invece di un dizionario. In python sono tipi distinti.

Do dirtyItems = {} invece.

+0

Grazie Carica ragazzi!Potevo sentire che era vicino, non sono sicuro di quanto tempo avrei impiegato per cercare un tipo di dizionario. – Toaster

1

Fai un dizionario, invece di un array:

import random 
import math 

dirtyItems = {} 

quindi è possibile utilizzare come:

dirtyItems[key.uid] = x