【问题标题】:Making the leap from PhP to Python从 PhP 到 Python 的飞跃
【发布时间】:2012-12-10 16:28:42
【问题描述】:

我是一个相当自在的 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";

    }
}
?>

所以,实际上我已经对大部分内容进行了排序,我只是在使用 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

我的 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.'

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

编辑:小修正。

【问题讨论】:

  • 尝试使用dirtyItems 作为dict 而不是list。您可以将键值对插入为dirtyItems[key]=value
  • 这太棒了,我现在可以使用了,谢谢,我认为更改的范围基本上包括将 [] 切换为 {} 和其他一些内容,这很有趣小修正。现在我可以将它集成到下一个版本的主项目中。
  • 如果你正在做诸如相交集之类的事情,那么你应该将对象设置为hashable,以便它们可以参与set

标签: php python associative-array


【解决方案1】:

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

改为dirtyItems = {}

【讨论】:

  • 谢谢你们!我能感觉到它很接近,我不确定我需要多长时间才能找到一个 Dictionary 类型。
【解决方案2】:

制作字典而不是数组:

import random
import math

dirtyItems = {}

然后你可以像这样使用:

dirtyItems[key.uid] = x

【讨论】:

    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    相关资源
    最近更新 更多