使用Python中的列表创建字典

2024-06-10 21:29:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大文件(大约有20万个输入)。输入格式如下:

A B C D
B E F
C A B D
D  

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

text = f.read().split('\n')

这将在文件看到新行时拆分文件。因此,正文如下:

[[A B C D] [B E F] [C A B D] [D]]

我现在必须将这些值存储在字典中,其中键值是每个列表中的第一个元素。i、 e钥匙是A、B、C、D。 我发现很难将这些值作为列表的其余元素输入。i、 词典应该是这样的:

{A: [B C D]; B: [E F]; C: [A B D]; D: []}

我已经做了以下工作:

    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}

请帮助我如何将这些值添加到字典中。如果列表中除了将作为键值的元素之外没有其他元素,则该值应为0。例如0。


Tags: 文件textin元素列表readdoc字典
3条回答

接受的答案是正确的,只是它将整个文件读入内存(如果您有一个大文件,则可能不需要),并且它将覆盖重复的密钥。

使用defaultdict的另一种方法(可从Python 2.4获得)可以解决以下问题:

from collections import defaultdict
d = defaultdict(list)
with open('/tmp/spam.txt') as f:
  for line in f:
    parts = line.strip().split()
    d[parts[0]] += parts[1:]

输入:

A B C D
B E F
C A B D
D  
C H I J

结果:

>>> d = defaultdict(list)
>>> with open('/tmp/spam.txt') as f:
...    for line in f:
...      parts = line.strip().split()
...      d[parts[0]] += parts[1:]
...
>>> d['C']
['A', 'B', 'D', 'H', 'I', 'J']

对词典的理解使这项任务完成得很短:

>>> 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': []}

尝试使用切片:

inlinkDict[docid] = adoc[1:]

对于只有键值在行上的情况,这将为您提供一个空列表,而不是0。要改为获取0,请使用or(它始终返回一个操作数):

inlinkDict[docid] = adoc[1:] or 0

听写理解更容易:

>>> 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}

注意:dict键必须是唯一的,所以如果有两行以“C”开头,那么第一行将被重写。

相关问题 更多 >