<p>这并不是pytorch特有的问题,而是一个一般的python问题。你知道吗</p>
<p>您正在使用<a href="https://docs.python.org/3/library/stdtypes.html#list" rel="nofollow noreferrer">list(<em>iterable</em>)</a>构建一个列表,其中<a href="https://docs.python.org/3/glossary.html#term-iterable" rel="nofollow noreferrer">iterable</a>类是实现<a href="https://docs.python.org/3/glossary.html#term-sequence" rel="nofollow noreferrer">sequence semantics</a>的类。你知道吗</p>
<p>在这里看一下<a href="https://docs.python.org/3/reference/datamodel.html#object.__getitem__" rel="nofollow noreferrer">^{<cd1>}</a>对于序列类型的预期行为(大多数相关部分用粗体表示)</p>
<blockquote>
<p><code>object.__getitem__(self, key)</code></p>
<p>Called to implement evaluation of
<code>self[key]</code>. For <strong>sequence</strong> types, the accepted keys should be integers
and slice objects. Note that the special interpretation of negative
indexes (if the class wishes to emulate a sequence type) is up to the
<code>__getitem__()</code> method. If key is of an inappropriate type, <code>TypeError</code> may be raised; <strong>if of a value outside the set of indexes for the
sequence (after any special interpretation of negative values),
<code>IndexError</code> should be raised.</strong> For mapping types, if key is missing (not
in the container), KeyError should be raised.</p>
<p><strong>Note: <code>for</code> loops expect that an <code>IndexError</code> will be raised for illegal
indexes to allow proper detection of the end of the sequence.</strong></p>
</blockquote>
<p>这里的问题是,对于序列类型,python期望在使用无效索引调用<code>__getitem__</code>时使用<code>IndexError</code>。似乎<code>list</code>构造函数依赖于此行为。在您的示例中,当<code>X</code>是dict时,尝试访问无效键会导致<code>__getitem__</code>引发<code>KeyError</code>,而这不是预期的,因此不会被捕获并导致列表的构造失败。你知道吗</p>
<hr/>
<p>根据这些信息,你可以做如下的事情</p>
<pre><code>class datasetTest:
def __init__(self):
self.X = {0: 12, 1:35, 2:99, 3:27, 4:33}
def __len__(self):
return len(self.X)
def __getitem__(self, index):
if index < 0 or index >= len(self):
raise IndexError
return self.X[index]
d = datasetTest()
print(list(d))
</code></pre>
<p>我不建议在实践中这样做,因为它依赖于只包含整数键的字典<code>X</code>、<code>0</code>、<code>1</code>、<code>len(X)-1</code>,这意味着在大多数情况下,它的行为就像一个列表,所以您最好只使用一个列表。你知道吗</p>