【发布时间】:2022-08-24 05:38:03
【问题描述】:
我们如何将cookiejar[(1, 2, 3)] 变成cookiejar[1][2][3]?
期望的行为是什么?
以下两段代码(LEFT CODE 和RIGHT CODE)在调用__getitem__ 时应该做同样的事情
+----------------------+--------------------------+
| LEFT CODE | RIGHT CODE |
+----------------------+--------------------------+
| cjar = CookieJar() | cjar = CookieJar() |
| result = cjar[index] | indices = [1, 2, 3] |
| | indices = iter(index) |
| | index = next(it) |
| | result = cjar[index][it] |
+----------------------+--------------------------+
更多示例如下所示。左侧列中的代码应该表现出与右侧列中的代码相同的外部行为。
+----------------------------+-------------------------------+
| cookie_jar[1][2][3] | cookie_jar[(1, 2, 3)] |
+----------------------------+-------------------------------+
| cookie_jar[x][y] | cookie_jar[(x, y)] |
+----------------------------+-------------------------------+
| cookie_jar[99] | cookie_jar[(99,)] |
+----------------------------+-------------------------------+
| cookie_jar[99] | cookie_jar[[[[99]]] |
+----------------------------+-------------------------------+
| cookie_jar[1][2][3] | cookie_jar[1, 2][3] |
+----------------------------+-------------------------------+
| cookie_jar[1][2][3] | cookie_jar[[1, [2]], [3]] |
+----------------------------+-------------------------------+
| cookie_jar[1][2][3] | cookie_jar[1, 2, 3] |
+----------------------------+-------------------------------+
| cookie_jar[3][11][19] | cookie_jar[3:20:8] |
+----------------------------+-------------------------------+
| cookie_jar[3][11][19] | cookie_jar[range(3, 20, 8)] |
+----------------------------+-------------------------------+
单个键/索引与键或索引容器之间有什么区别?
如果您尝试将table[\"hello world\"] 转换为table[\'h\'][\'e\'][\'l\'][\'l\'][\'o\']... [\'l\'][\'d\'],您可以轻松创建无限循环。
以下代码永远不会停止运行:
def go_to_leaf(root):
while hasattr(root, \'__iter__\'):
root = iter(root)
root = next(root)
# BEGIN INFINITE LOOP!
left_most_leaf = go_to_leaf(\"hello world\")
应该改用这样的东西:
def is_leaf(cls, knode):
\"\"\"
returns true if the input is a valid key (index)
into the container.
returns false if the input is a container of keys
or is an invalid key
\"\"\"
if hasattr(knode, \"__iter__\"):
return str(knode) == \"\".join(str(elem) for elem in knode)
else: # not iterable
return True
如果您有一个 3 维数字表,那么 x-y 坐标是在单个元组或列表中还是单独使用都没有关系。
element = table[2][7][3]
element = table[2, 7, 3]
element = table[(2, 7, 3)]
-
一个函数不知道它的结果将如何被使用。所以
cookiejar[1]不能返回不同的结果,这取决于它是否会被[2]进一步索引。 -
@Barmar 我们不需要知道
root[1]是否会被进一步索引或不被进一步索引。在树应用程序中root[1]返回树中根节点的子节点。对于root[1][2],起初我们有一个根节点的子节点,但最终我们有一个根节点的孙子节点。我们写root[1]然后退出或写root[1][2]都没有关系。同样,如果您有一个数字矩阵mat[3]返回第 3 行。如果您想要第 3 行和第 8 列中的值,那么我们有mat[3][8]行对象不知道它是否会被进一步索引或它最终用户想要整行。 -
对不起,我误解了你在问什么。问题太长了,大部分都没看。
-
@Barmar 这是一个很长的问题,是的。我希望我更简洁。我建议阅读除代码块之外的所有内容。如果您仍然感兴趣,请返回并阅读代码块。
-
所以你基本上是在问如何将
cookiejar[(1, 2, 3)]变成cookiejar[1][2][3]?后者是索引多个维度的正常方法,您希望能够使用可迭代来代替。
标签: python python-3.x indexing containers operator-overloading