在Python中,存储需要经常更新的一对值的最佳方法是什么?

3
我有一个用例,需要在Python中存储一对值,这两个值都需要经常更新。 我应该使用列表、元组还是其他什么数据类型? 从一方面来说,列表更容易更新,因为元组是不可变的,每次更新任何一个值都需要创建一个新的元组。但是,由于我不会将任何内容附加到列表中,并且大小固定为2,所以感觉元组可能更好地表示了对象的实际含义。
有什么建议吗?谢谢!

1
我会选择列表。没有必要过度思考。 - Patrick Haugh
1
我不认为“数据大小变化”是使用列表的必要条件。我经常使用大小不变的列表。 - Kevin
嗯,我想……让我检查一下,就一秒钟。 - SIGSTACKFAULT
@Kevin Huh。我在某个地方读到你需要这样做。<cyberman voice>删除。 - SIGSTACKFAULT
4个回答

2
创建一个配对类?
class pair(object):
     def __init__(self,first,second):
         self.update(first,second)
     def update(self,first,second):
         self.first = first
         self.second = second

这表明只有两个对象,欢迎更新。如果你想要其他对/列表/元组的基本算术运算,你可以很容易地实现它。


2

有几种方法可以创建这样的东西,但我建议使用一个 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)

在工程领域,我们有一个原则——KISS原则——保持简单,傻瓜。如果你需要被提醒KISS原则,那就是真的需要了。同样适用于这里。不要过度思考。使用列表。你有我的支持。 - SIGSTACKFAULT
@Blacksilver 你是什么意思?你是在暗示我过度思考我的回答吗?如果是这样,怎么了? - Christian Dean
不,我在和用户交流 :) - SIGSTACKFAULT
@Blacksilver 哦,好的。抱歉 :) - Christian Dean
完全合理的假设。这可能是我会想到的。 - SIGSTACKFAULT

0

如果您关心性能并想要为字段命名,请使用__slots__

class datum(object):
    __slots__ = ['x', 'y']

现在你有了一个简单、高性能、紧凑的类型,它不需要字典查找来访问字段。

但是如果你关心性能并且不想命名字段,那么最好还是坚持使用list


0

在这里使用列表是完全足够的。你不应该因为数据总是有相同的数量而将其排除作为可能性。

我觉得在这里使用元组并不合适,因为1)通常情况下,你使用不可变类型来存储不会改变的数据,而你的数据是会改变的。2)如果你需要独立更新一个值,语法会变得不必要地冗长。比较一下元组的语法:

my_pair = (new_first_value, my_pair[1])

关于列表语法:

my_pair[0] = new_first_value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接