我使用列表 os.listdir(' ./ foo')中的长度和元素创建了以下字典理解(第一行代码组)。结果字典不是我期待的字典。为什么会这样?
MasterDetailPageVariable.isPresented = true;
但
>>>folder = {k : v for k in range(len(os.listdir('./foo'))) for v in os.listdir('./foo')}
>>>print(folder)
>>>{0: 'foo0', 1: 'foo0', 2: 'foo0', 3: 'foo0'}
所以,我期待以下字典而不是第一个字典。
>>>print(os.listdir('./foo'))
>>>{0: 'foo0', 1: 'foo1', 2: 'foo2', 3: 'foo3'}
由于
答案 0 :(得分:2)
你没有正确地理解dict,你不应该有2个不同的for
语句。相反,使用zip
:
folder = {k : v for k,v in zip(range(len(os.listdir('./foo'))), os.listdir('./foo'))}
甚至更好,请使用enumerate()
:
folder = {k : v for k,v in enumerate(os.listdir('./foo'))}
答案 1 :(得分:0)
重写原始理解,因为嵌套for
在逻辑上(大致)表示循环:
folder = {}
for v in os.listdir('./foo'):
for k in range(len(os.listdir('./foo'))):
folder[k] = v
除了您反复调用os.listdir
之外,您还要在字典中为每个键插入多个项目。正确的理解更像是:
folder = {k: v for (k, v) in enumerate(os.listdir('./foo'))}
在相关的说明中,os.listdir()
的结果是列表,而不是字典,所以
>>> print(os.listdir('./foo'))
['foo0', 'foo1', 'foo2', 'foo3']
比您发布的内容更可能出现。
答案 2 :(得分:0)
看起来你对字典理解的语义不太正确:
{k : v for k in range(len(os.listdir('./foo'))) for v in os.listdir('./foo')}
等同于" 迭代来自v
的所有os.listdir()
,并且对于v
中的每一个,k
遍历来自range()
的所有k
}
由于简单的字典无法容纳重复的v
- {k : os.listdir('./foo')[-1] for k in range(len(os.listdir('./foo')))}
- 对,因此最后的分配计数,因此上述内容基本等同于:
dict((k, v) for k in range(len(os.listdir('./foo'))) for v in os.listdir('./foo'))
请注意,语义与理解被写为
的语义相同1 2 3 4 5 6 7 8 9 10 (Correct number is 10, for instance)
Guess: 5 - higher
Guess: 8 - higher
Guess: 9 - higher
Guess: 10 - correct
这些都没有任何意义,因此你可能想要添加更多信息,实际上你想要实现的目标。