Создание словаря со списком списков в Python

У меня есть огромный файл (с примерно 200 тыс. входов). Входы представлены в форме:

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

Теперь я должен хранить эти значения в словаре, где ключевые значения являются первым элементом из каждого списка. то есть клавиши будут A, B, C, D. Мне трудно вводить значения в качестве остальных элементов списка. то есть словарь должен выглядеть так:

{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.

Ответ 1

Попробуйте использовать ломтик:

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', первая будет перезаписана.

Ответ 2

Понимание словаря делает короткую работу по этой задаче:

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

Ответ 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:]

Input:

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']