字典理解和os.listdir() - python3

时间:2015-11-17 16:29:22

标签: python-3.x dictionary-comprehension

我使用列表 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'}

由于

3 个答案:

答案 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

这些都没有任何意义,因此你可能想要添加更多信息,实际上你想要实现的目标。