填写字典有什么问题

时间:2016-04-30 17:33:03

标签: python dictionary

我想在以下代码中填充字典newDict

def sessions():
    newDict = {}
    output = exe(['loginctl','list-sessions']) # uses subprocess.check_output(). returns shell command's multiline output
    i = 0;
    for line in output.split('\n'):
        words = line.split()
        newDict[i] = {'session':words[0], 'uid':words[1], 'user':words[2], 'seat':words[4]}
        i += 1
    stdout(newDict) # prints using pprint.pprint(newDict)

但它只会让我犯错:

newDict[i] = {'session':words[0], 'uid':words[1], 'user':words[2], 'seat':words[4]}
IndexError: list index out of range

如果我在循环中print words,那么我得到的是:

['c3', '1002', 'john', 'seat0']
['c4', '1003', 'jeff', 'seat0']

我做错了什么?

4 个答案:

答案 0 :(得分:1)

Imo你应该检查"单词"不是太短。在分割一些行之后,它很可能是列表长度的问题(它没有足够的元素)。

答案 1 :(得分:1)

我认为,这是一个错字: 您使用words[4]代替words[3]

顺便说一句: 这是代码的略微改进版本。它使用splitlines()代替split('\n')并跳过空行。它使用enumerate(),在迭代集合时计算条目时,它是一个非常简洁的函数。

def sessions():
    newDict = {}
    output = exe(['loginctl','list-sessions']) #returns shell command's multiline output
    for i, line in enumerate(output.splitlines()):
        if len(line.strip()) == 0:
            continue
        words = line.split()
        print words
        newDict[i] = {'session':words[0], 'uid':words[1], 'user':words[2], 'seat':words[3]}
    stdout(newDict) # prints using pprint.pprint(newDict)

答案 2 :(得分:0)

我最好的猜测是,单词并不总是包含五个项目,

请在分配字典之前尝试打印len(单词)。

答案 3 :(得分:0)

据我所知,这与字典本身无关,而是解析输出。以下是我获得的输出示例:

   SESSION        UID USER             SEAT            
        c2       1000 willem           seat0           

1 sessions listed.

或字符串版本:

'   SESSION        UID USER             SEAT            \n        c2       1000 willem           seat0           \n\n1 sessions listed.\n'

这一切都出现在stdout上。问题是 - 正如你所看到的那样 - 不是每一行都包含四个单词(底部有空行)。或更多pythonic:

>>> lines[2].split()
[]

因此,您必须检查该行是否有四列:

def sessions():
    newDict = {}
    output = exe(['loginctl','list-sessions']) # uses subprocess.check_output(). returns shell command's multiline output
    i = 0;
    for line in output.split('\n'):
        words = line.split()
        if len(words) >= 4:
            newDict[i] = {'session':words[0], 'uid':words[1], 'user':words[2], 'seat':words[3]}
            i += 1
    stdout(newDict)

(以粗体突出显示的更改)

在代码中,我还将words[4]重写为words[3]