使用Python创建包含列表列表的字典

gsb*_*gsb 17 python dictionary list

我有一个巨大的文件(大约200k输入).输入格式如下:

A B C D
B E F
C A B D
D  
Run Code Online (Sandbox Code Playgroud)

我正在读取此文件并将其存储在列表中,如下所示:

text = f.read().split('\n')
Run Code Online (Sandbox Code Playgroud)

这会在文件看到新行时拆分文件.因此文字如下:

[[A B C D] [B E F] [C A B D] [D]]
Run Code Online (Sandbox Code Playgroud)

我现在必须将这些值存储在字典中,其中键值是每个列表中的第一个元素.即键将是A,B,C,D.我发现很难输入值作为列表的其余元素.即字典应如下所示:

{A: [B C D]; B: [E F]; C: [A B D]; D: []}
Run Code Online (Sandbox Code Playgroud)

我做了以下事情:

    inlinkDict = {}
    for doc in text:
    adoc= doc.split(' ')
    docid = adoc[0]
    inlinkDict[docid] = inlinkDict.get(docid,0) +  {I do not understand what to put in here}
Run Code Online (Sandbox Code Playgroud)

请帮助我如何将值添加到我的字典中.如果列表中没有元素,那么它应该是0,除了作为键值的元素.就像0中的例子一样.

Ray*_*ger 22

字典理解简化了这项任务:

>>> s = [['A','B','C','D'], ['B','E','F'], ['C','A','B','D'], ['D']]
>>> {t[0]:t[1:] for t in s}
{'A': ['B', 'C', 'D'], 'C': ['A', 'B', 'D'], 'B': ['E', 'F'], 'D': []}
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用的是一个早于生成器表达式的python版本,你可以使用``dict([(t [0],t [1:])来表示t])``.而且,如果您使用的是旧版本,则可以使用``for t in s:d [t [0]] = t [1:]``.而且,如果你的时间远不及Python不存在,你可以使用Dartmouth BASIC来对数组进行DIM操作,这样你就可以通过编写自己的哈希函数来模拟哈希表.而且,如果您正在使用没有更高级语言的系统,您可以将汇编程序代码转换为机器语言并使用切换开关输入程序...... (11认同)

wim*_*wim 20

尝试使用切片:

inlinkDict[docid] = adoc[1:]
Run Code Online (Sandbox Code Playgroud)

对于只有键值在行上的情况,这将为您提供一个空列表而不是0.要获得0,您可以使用条件赋值:

inlinkDict[docid] = adoc[1:] or 0
Run Code Online (Sandbox Code Playgroud)

简单易懂的词典理解:

>>> with open('/tmp/spam.txt') as f:
...     data = [line.split() for line in f]
... 
>>> {d[0]: d[1:] for d in data}
{'A': ['B', 'C', 'D'], 'C': ['A', 'B', 'D'], 'B': ['E', 'F'], 'D': []}
>>> {d[0]: ' '.join(d[1:]) if d[1:] else 0 for d in data}
{'A': 'B C D', 'C': 'A B D', 'B': 'E F', 'D': 0}
Run Code Online (Sandbox Code Playgroud)

注意:dict键必须是唯一的,所以如果你有两行以'C'开头,那么第一行将被覆盖.