我有一个用例,需要在Python中存储一对值,这两个值都需要经常更新。 我应该使用列表、元组还是其他什么数据类型? 从一方面来说,列表更容易更新,因为元组是不可变的,每次更新任何一个值都需要创建一个新的元组。但是,由于我不会将任何内容附加到列表中,并且大小固定为2,所以感觉元组可能更好地表示了对象的实际含义。
有什么建议吗?谢谢!
有什么建议吗?谢谢!
class pair(object):
def __init__(self,first,second):
self.update(first,second)
def update(self,first,second):
self.first = first
self.second = second
这表明只有两个对象,欢迎更新。如果你想要其他对/列表/元组的基本算术运算,你可以很容易地实现它。
有几种方法可以创建这样的东西,但我建议使用一个 list
。没有必要过度思考。
我不会将任何内容附加到列表中,并且大小固定为2,感觉元组可能更好地表示对象实际上是什么。
不,列表不必改变大小。列表可以在整个程序中保持恒定的大小。而且列表具有明显的优势,它支持项目分配。
如果您正在寻找一种轻量级解决方案,则可以考虑使用 collections.namedtuple
,以解决 @kabanus 的问题。事实上,Python 的官方文档展示了一个使用点的namedtuple
示例:
>>> # Basic example
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22) # instantiate with positional or keyword arguments
>>> p[0] + p[1] # indexable like the plain tuple (11, 22)
33
>>> x, y = p # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y # fields also accessible by name
33
>>> p # readable __repr__ with a name=value style
Point(x=11, y=22)
如果您关心性能并想要为字段命名,请使用__slots__
:
class datum(object):
__slots__ = ['x', 'y']
现在你有了一个简单、高性能、紧凑的类型,它不需要字典查找来访问字段。
但是如果你关心性能并且不想命名字段,那么最好还是坚持使用list
。
在这里使用列表是完全足够的。你不应该因为数据总是有相同的数量而将其排除作为可能性。
我觉得在这里使用元组并不合适,因为1)通常情况下,你使用不可变类型来存储不会改变的数据,而你的数据是会改变的。2)如果你需要独立更新一个值,语法会变得不必要地冗长。比较一下元组的语法:
my_pair = (new_first_value, my_pair[1])
关于列表语法:
my_pair[0] = new_first_value