Python 您建议使用哪种数据结构来处理这些数据?

Python 您建议使用哪种数据结构来处理这些数据?,python,data-structures,Python,Data Structures,我有一个网格网络,有许多节点,坐标为(x,y),我有几个人访问网络中的这些节点。例如,个人1访问节点(1,3),(4,5),(8,9),个人2访问(4,3),(2,5) 我需要为每个人访问这些节点(比如说在所有人的for循环中),但我不知道在python中实现这一点的最佳方法 您可以创建一个名为“个人”的类来保存该个人的所有相关信息。然后,您可以将这些单独的对象放入列表或任何您想要的数据结构中 class Individual: def __init__(self, visited):

我有一个网格网络,有许多节点,坐标为(x,y),我有几个人访问网络中的这些节点。例如,个人1访问节点
(1,3)
(4,5)
(8,9)
,个人2访问
(4,3)
(2,5)


我需要为每个人访问这些节点(比如说在所有人的for循环中),但我不知道在python中实现这一点的最佳方法

您可以创建一个名为“个人”的类来保存该个人的所有相关信息。然后,您可以将这些单独的对象放入列表或任何您想要的数据结构中

class Individual:
    def __init__(self, visited):
        self.visited = visited  # type: list[tuple]

    def add_visit(self, node):
        self.visited.append(node)


individuals = [
    Individual([(1, 3), (4, 5), (8, 9)]), 
    Individual([(4, 3), (2, 5)])
]

for individual in individuals:
    pass  # do stuff

其他人建议为这项任务设置一个类,但我认为您最好只使用普通字典(
dict
)或
defaultdict
。无需为没有方法且只包含节点列表的对象创建类,尤其是当python拥有如此丰富的容器库时

在Python 3中使用dict的解决方案:

individuals = {}
individuals["1"] = [(1, 3), (4, 5), (8, 9)]
individuals["2"] = [(4, 3), (2, 5)]

for ind, node in individuals.items():
    print(ind, node)

individuals["2"].append((6, 7))

一个
类个体
节点列表
?你说“不需要创建一个类”,好像创建一个类很昂贵。我想说的是,没有必要在类更符合逻辑的地方创建字典。我认为它不昂贵,但符合逻辑。但这是一个关于范式的争论,最终是关于偏好的。我更喜欢在操作数据时使用容器,因为这些数据没有任何合理的方法,只是:数据。这里给出的类解决方案不过是列表上的包装器。我怀疑会对这些数据进行一些计算。在计算效率方面,您很少能超过python内置程序。此外,个人[“1”][i]与个人[0]之间也存在差异。已访问[i]。但正如我所说,这是一个范例偏好的事情,没有正确的答案。你可以自由地表达你关于为什么“类更具逻辑性”的论点,因为我认为恰恰相反:POf课程是关于偏好的。听起来你对班级还有其他动机。无论如何,如果问题中没有映射(key->value),我就不使用dict,并且我避免了太多的嵌套(例如,元组集合的dict列表),因为这样的代码是不可读的。当你遇到一个
Individual
的实例时,你知道它是什么,但是dict将字符串映射到元组列表可能是任何东西。这是真的。这完全取决于用例。如果个体不需要通过键访问,只需迭代,那么它甚至可以是一个元组列表。您是对的,在某个时候可能会变得不清楚,当然,我认为可读代码在任何时候都比性能稍好一些。如果我要使用一个类,我可能会使用子类
list
,这样我就可以充分利用这两个世界。这样,当我遇到它时,我就可以知道它的实例,但也有内置的便利。