【问题标题】:Python data structures, dictionary?Python数据结构,字典?
【发布时间】:2010-01-09 02:23:52
【问题描述】:

我希望有人可以提供帮助。我正在使用 Python,我希望能够执行以下操作。

我有一组对象(例如形状)和一系列命令来作用于这些对象。命令具有命令字符串的格式,后跟可变数量的参数,可以是字符串或整数

例如,形状“矩形”可能有以下命令
'改变颜色' '绿色'
'FillStyle' '孵化'
'尺寸' 10 15
等等......

存储这些信息的最佳数据结构是什么。给定对象的“形状”,我​​需要能够轻松地从数据结构中检索这些命令。字典是正确的选择吗,我以前从未使用过这些

谢谢

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    创建自己的类可能会更好:

    class Shape(object):
        def __init__(self):
            self.shape = "rectangle"
            self.color = "green"
            self.fillstyle = "hatch"
            # etc
    
        def ChangeColor(self, color):
            self.color = color
    
        # etc
    

    【讨论】:

    • 那些是属性,但他想表示命令。我不认为这很有用。
    • @danben:只需在对象定义中添加一个方法: def ChangeColor(self, color): self.color = color.lower() @recursive:有一个错字,你应该替换'this ' 与'自我'
    • 谢谢你。我添加了一种方法来说明命令如何工作并修复了“this”错字。我脑子里该死的 C#。
    • @dalolilogm:这要求对象知道可以在其上执行的所有可能命令。这个问题在我看来更像是一种解释语言类型的东西。
    【解决方案2】:

    dicts 用于顺序不重要但您希望存储不同名称的值的情况。

    lists 是有序的对象序列,通常是相同的类型,位置并不意味着什么。

    tuples 是对象的有序序列,可能有不同的类型,每个不同的位置都有特定的含义。

    【讨论】:

      【解决方案3】:

      我建议使用对象类并将所有值/命令存储在该对象中,以便您可以轻松地传递它。 (类似于recursive 所说的)。

      但是;您还可以使用字典,键是对象名称,值是包含可能命令的列表。

      【讨论】:

        【解决方案4】:

        在我看来,命令可以表示为列表[] 或元组(),一系列命令也可以。所以一种可能性是你有一个字符串列表的列表。通常,仅当您想通过键查找值时才想使用字典。例如,如果您知道命令的名称(形状)并想知道传递给该命令的参数,您可以有一个从字符串到列表的字典映射。

        如果您发布更多关于您计划如何使用这些数据的信息,我可以给出更好的答案。

        这里是基本数据结构的 Python 文档的链接,应该很有帮助:http://docs.python.org/tutorial/datastructures.html

        编辑:响应第一条评论,您需要存储命令还是只从输入中逐个读取并执行它们?

        【讨论】:

        • 你好,丹本。谢谢。我忘了提到命令是按顺序执行的。所以给定一个形状,我会检索第一个命令并执行。完成后,我将处理第二个命令,依此类推
        【解决方案5】:

        这个怎么样?

        示例

        s = {'Rectangle':
                {'ChangeColor':'green','FillStyle':'hatch',
                 'Dimension1': 10, 'Dimension2':15}}
        s['Triangle'] = {'ChangeColor':'red','FillStyle':'hatch',
                 'Dimension1': 10, 'Dimension2':15, 'Dimension3':5}
        
        for k, v in s.iteritems():
            print k
            for k1, v1 in v.iteritems():
                print "   ", k1, "=", v1
        

        结果:

        Triangle
            Dimension1 = 10
            Dimension2 = 15
            Dimension3 = 5
            ChangeColor = red
            FillStyle = hatch
        Rectangle
            Dimension1 = 10
            Dimension2 = 15
            ChangeColor = green
            FillStyle = hatch
        

        【讨论】:

        • 是的,谢谢,我将如何处理没有参数的命令,即没有值的键。谢谢
        • 打印k后,写:如果不是v:打印“空”继续
        【解决方案6】:

        我会将命令存储为列表或元组的列表,这取决于我是否认为我会修改命令。请注意,Python 中的参数解包为执行这些命令提供了一种非常简单的机制,例如:

        class Shape(object):
            def background(self, color):
                print "background:", color
            def foreground(self, color):
                print "foreground:", color
            def rect(self, left, top, right, bottom):
                print "rect:", left, top, right, bottom
            def execute_commands(self, command_list):
                for command in command_list:
                    if hasattr(self, command[0]):
                        getattr(self, command[0])(*command[1:])
        
        >>> s = Shape()
        >>> c = [('background', 'blue'), ('foreground', 'yellow'), ('rect', 10, 0, 20, 20)]
        >>> s.execute_commands(c)
        background: blue
        foreground: yellow
        rect: 10 0 20 20
        

        【讨论】:

          猜你喜欢
          • 2021-01-12
          • 1970-01-01
          • 1970-01-01
          • 2013-12-10
          • 2011-06-25
          • 2023-04-08
          • 2016-06-21
          • 1970-01-01
          • 2015-04-25
          相关资源
          最近更新 更多