2

我对 Python 很陌生。我想我的问题很简单,但我找不到任何答案。我想创建、删除一个组合列表(作为 C 结构)并访问其中的项目:

    for i in list1
      create item in list2[list3[StringVar1, StringVar2], bool1, Frame1]
      item.list3[StringVar1] = i
      item.list3[StringVar2] = value
      item.bool1 = True
      item.Frame1 = tk.Frame(self)

我怎么能用 Python 写呢?

编辑:Martijn Pieters 是对的,我刚刚更正了。

4

4 回答 4

4

当您说组合列表时,我并不完全理解您的意思,但实际上您可以在 Python 中拥有一个结构。

理想情况下,你的意思是你想要一个不可变的 C-Struct 类对象,那么你可以很容易地创建它。在 Python 中,它被称为 a namedtuple,或者至少这是我遇到的最接近的。您当然可以在 Python 中创建自己的通用对象,并添加参数,但这将是一个动态结构。

理想情况下,在 C 中,您将拥有这样的结构 ->

struct tag_name
{
   type attribute;
   type attribute2;
   /* ... */
};

struct并且您可以访问like的属性tag_name.attribute。所以,这就是 a 的namedtuple工作原理:

>>> from collections import namedtuple
>>> NetworkAddress = namedtuple('NetworkAddress',['hostname','port'])
>>> a = NetworkAddress('www.python.org',80)
>>> a.hostname
'www.python.org'
>>> a.port
80
>>> host, port = a
>>> len(a)
2
>>> type(a)
<class '_ _main_ _.NetworkAddress'>
>>> isinstance(a, tuple)
True
>>>

如果您有什么特别想要的,请更新您的问题以解释组合列表,以便我可以更新此答案。

然而,这是像 C 这样的静态类型语言的典型特征,因为我们使用的是 Python,我们可以使用一些很酷的动态属性,因此您基本上可以创建一个对象,您可以根据需要添加属性:

class DynamicObject(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

控制台会话

>>> class DynamicObject(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
>>> happy_obj = DynamicObject(name="Happy Gilmore")
>>> happy_obj.name
'Happy Gilmore'

学分->

https://stackoverflow.com/users/320726/6502获取动态对象代码。谢啦 :)

于 2013-09-26T12:01:16.473 回答
0

你总是可以使用 Python 字典

item = {}
item["list2"] = {}
item["list2"]["list3"] = {}
item["list2"]["list3"][Var1] = Value1
item["list2"]["list3"][Var2] = Value2
...

您也可以指定另一个字典或列表作为值。

就删除而言,您可以使用“del”关键字进行删除。例如

dictionary = {}
dictionary["name"] = {}
dictionary["name1"] = {}
del dictionary["name1"]
dictionary
{'name': {}}
于 2013-09-26T11:58:12.057 回答
0

您应该知道新样式对象(从 派生的任何东西object)都有一个__dict__成员,即dict. 所以你可以这样做:

class X(object):
    pass

x = X()
x.__dict__["a"] = 1
x.a #1

另一种方法是对用户setattrgetattr

setattr(x, "b", 2) # same as x.__dict__["b"] = 2

您可以使用它来构建对某些输入结构的命名访问,但是您将需要复合输入结构中的名称和值(本质上,类似于所有节点的嵌套字典)

于 2013-09-26T12:01:27.103 回答
0

但是,我认为您的数据结构是错误的。因为使用方法就像 c 中的数组。这意味着我们可以通过数字索引找到 elem,所以你不能使用 list like list3[StringVar1,StringVar2]。也许python中的字典可以满足您的需要。如果你想使用item.list3你必须在 python 中定义一个类。

于 2013-09-26T12:02:40.360 回答