<p>大概是这样的:</p>
<pre><code>from pprint import pprint
my_list = [['Raji GlovesSixSixOneRegular price',
'Sale price$9.95',
' Save 67%'],
['Comp Vortex GlovesSixSixOneRegular price',
'Sale price$9.95',
' Save 67%'],
["Shasta 3/4 Cycling Tights - Women'sSpecializedRegular price",
'Sale price$14.95',
' Save 79%']]
my_dict = {
n + 1: d for n, d in enumerate(
dict(zip(['ItemName', 'SalePrice', 'Saving'], item)) for item in my_list
)
}
pprint(my_dict)
</code></pre>
<p>结果:</p>
<pre><code>{1: {'ItemName': 'Raji GlovesSixSixOneRegular price',
'SalePrice': 'Sale price$9.95',
'Saving': ' Save 67%'},
2: {'ItemName': 'Comp Vortex GlovesSixSixOneRegular price',
'SalePrice': 'Sale price$9.95',
'Saving': ' Save 67%'},
3: {'ItemName': "Shasta 3/4 Cycling Tights - Women'sSpecializedRegular price",
'SalePrice': 'Sale price$14.95',
'Saving': ' Save 79%'}}
</code></pre>
<p>注意:<code>pprint</code>仅用于漂亮的字典,您不需要导入来使代码本身工作</p>
<p>解决方案的工作原理如下:</p>
<ul>
<li>在外面,你可以理解字典,把元组的一个可数转换成字典;一个简单的例子是:</li>
</ul>
<pre><code>ts = [(1, 'one'), (2, 'two')]
d = {number: name for number, name in ts}
</code></pre>
<ul>
<li>它不是像该示例中那样传入元组列表,而是获取<code>enumerate()</code>函数的结果,该函数接受一个iterable并返回一个iterable,该iterable将每个元素与一个索引配对,例如:</li>
</ul>
<pre><code># this prints [(0, 'a'), (1, 'b'), (2, 'c')]
print(list(enumerate(['a', 'b', 'c'])))
</code></pre>
<ul>
<li>你可以看到它是如何让你得到你需要的东西来填充字典的,除了它从<code>0</code>开始,所以这就是为什么在<code>n</code>之后有一个<code>+ 1</code></li>
<li><code>enumerate()</code>函数获取生成器表达式<code>dict(<something>) for item in my_list)</code>的结果。枚举生成器表达式的示例如下:</li>
</ul>
<pre><code>print(list(enumerate(n for n in range(10, 20))))
</code></pre>
<ul>
<li>生成器异常使用<code>zip()</code>,它获取两个iterable并将结果配对,在本例中是内部字典所需的键<code>['ItemName', 'SalePrice', 'Saving']</code>和原始列表中的列表,一个接一个,由生成器表达式传递给它。尝试运行以下命令:</li>
</ul>
<pre><code>print(list(list(zip(['ItemName', 'SalePrice', 'Saving'], item)) for item in my_list))
</code></pre>
<p>这应该会让你知道发生了什么</p>
<p>通常,如果您收到一段代码,但您无法真正说出原因,请尝试查看表达式是如何组合在一起的。如果你真的把它拆开,它看起来是这样的:</p>
<pre><code>my_dict = {
number + 1: dict_element
for number, dict_element in enumerate(
dict(
zip(['ItemName', 'SalePrice', 'Saving'], item)
)
for item in my_list
)
}
</code></pre>
<p>然后试着理解每一点,从内部开始。因此,在本例中,您需要了解<code>zip()</code>的作用。玩转函数,直到理解它,然后再上一层,看看<code>dict()</code>对<code>zip()</code>函数的结果做了什么。一旦你得到它,看看为什么它后面有一个<code>for</code>(它是一个生成器),等等</p>
<p>当然,如果您希望您的代码比其他任何代码都短,这是相同的,但很难理解:</p>
<pre><code>d = {n+1: d for n, d in enumerate(dict(zip(['ItemName','SalePrice','Saving'], x)) for x in my_list)}
</code></pre>
<p>我很感激你要求解释,因为这意味着你在努力学习,而不仅仅是抄袭答案——坚持下去</p>