实现从PhP到Python的跨越

Toa*_*ter 5 php python associative-array

我是一个相当舒服的PHP程序员,并且几乎没有Python经验.我正在尝试用他的项目来帮助一个伙伴,代码很容易用Php编写,我已将其中大部分移植过来,但如果可能的话需要一些帮助来完成翻译.目标是:

  • 使用uid生成基本对象列表
  • 随机选择几个项目以创建第二个列表,该列表键入包含新属性的uid.
  • 测试两个列表之间的交叉点以相应地改变响应.

以下是我尝试在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";

    }
}
?>
Run Code Online (Sandbox Code Playgroud)

所以,我真的把它的大部分都排序了,我只是遇到了Python版本的关联数组的问题,要有一个列表,其键与主列表中的唯一项目数相匹配.

上面代码的输出应类似于:

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
Run Code Online (Sandbox Code Playgroud)

我的Python技能仍在使用,但这与上面的代码块大致相同.我一直在寻找并尝试使用列表函数.insert()或.setitem(),但它并没有按预期工作.

这是我目前的Python代码,尚未完全正常运行

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.'
Run Code Online (Sandbox Code Playgroud)

所以,对于长篇文章感到抱歉,但我想通过并提供两套完整的代码.PhP工作得很好,Python也很接近.如果有人能指出我正确的方向,那将是一个巨大的帮助. dirtyItems.insert(key.uid,x)是我试图用来使列表作为Assoc数组工作的东西

编辑:小修正.

sbl*_*lom 2

您声明dirtyItems为数组而不是字典。在 python 中,它们是不同的类型。

而是做dirtyItems = {}