Python: сохранение значения списка, связанного с ключом, в словаре - PullRequest
1 голос
/ 12 сентября 2010

Я знаю, как словари Python хранят ключ: значение кортежей. В проекте, над которым я работаю, мне необходимо хранить ключ, связанный со значением, которое представляет собой список. например: ключ -> [0,2,4,5,8] где, ключ это слово из текстового файла значение списка содержит целые числа, обозначающие DocID, в которых встречается слово.

как только я найду то же слово в другом документе, мне нужно добавить этот DocID в список.

Как мне этого добиться?

Ответы [ 6 ]

6 голосов
/ 12 сентября 2010

Вы можете использовать по умолчанию, как это:

>>> import collections
>>> d = collections.defaultdict(list)
>>> d['foo'].append(9)
>>> d
defaultdict(<type 'list'>, {'foo': [9]})
>>> d['foo'].append(90)
>>> d
defaultdict(<type 'list'>, {'foo': [9, 90]})
>>> d['bar'].append(5)
>>> d
defaultdict(<type 'list'>, {'foo': [9, 90], 'bar': [5]})
1 голос
/ 17 сентября 2015

Этот пост помог мне решить проблему с динамическим созданием переменных ключей со списками прикрепленных данных.См. Ниже:

import collections

d = collections.defaultdict(list)
b = collections.defaultdict(list)
data_tables = ['nodule_data_4mm_or_less_counts','nodule_data_4to6mm_counts','nodule_data_6to8mm_counts','nodule_data_8mm_or_greater_counts']

for i in data_tables:
    data_graph = con.execute("""SELECT ACC_Count, COUNT(Accession) AS count
                                            FROM %s
                                            GROUP BY ACC_Count"""%i)
    rows = data_graph.fetchall()
    for row in rows:
        d[i].append(row[0])
        b[i].append(row[1])

print d['nodule_data_4mm_or_less_counts']
print b['nodule_data_4mm_or_less_counts']

, который выводит списки данных для каждого ключа и затем может быть изменен на массив np.ar для построения и т. Д.

>>>[4201, 1052, 418, 196, 108, 46, 23, 12, 11, 8, 7, 2, 1]
>>>[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16]
1 голос
/ 12 сентября 2010

Это было бы хорошим местом для использования defaultdict

from collections import defaultdict

docWords = defaultdict(set)
for docID in allTheDocIDs:
    for word in wordsOfDoc(docID):
        docWords[word].add(docID)

Вы можете использовать список вместо набора, если вам нужно

0 голосов
/ 12 сентября 2010

Однажды я написал вспомогательный класс, чтобы сделать ответ @Vinko Vrsalovic более простым в использовании:

class listdict(defaultdict):
    def __init__(self):
        defaultdict.__init__(self, list)

    def update(self, E=None, **F):
        if not E is None:
            try:
                for k in E.keys():
                    self[k].append(E[k])
            except AttributeError:
                for (k, v) in E:
                    self[k].append(v)
        for k in F:
            self[k].append(F[k])

Это можно использовать так:

>>> foo = listdict()
>>> foo[1]
[]
>>> foo.update([(1, "a"), (1, "b"), (2, "a")])
>>> foo
defaultdict(<type 'list'>, {1: ['a', 'b'], 2: ['a']})
0 голосов
/ 12 сентября 2010

Как то так?


word = 'something'
l = [0,2,4,5,8]
myDict = {}
myDict[word] = l

#Parse some more

myDict[word].append(DocID)

0 голосов
/ 12 сентября 2010

Если я правильно понял ваш вопрос, вы можете попробовать это,

           >>> a=({'a':1,'b':2});
           >>> print a['a']
            1
           >>> a.update({'a':3})
           >>> print a['a']
            3
            >>> a.update({'c':4})
            >>> print a['c']
             4

Это будет работать с более старыми версиями python

...