Словарь Питона или Альтернатива - PullRequest
1 голос
/ 29 декабря 2011

Например,

if dict['sample']:
    //append values to dict['sample']
else:
    // assign new key to the python dictionary

Если dict ['sample'] пусто, Python выдаст ошибки. Кто-нибудь знает лучший способ проверить это?

Все, что я хочу, это что-то вроде этого, у меня будет список данных, скажем, a, a, b, c, g, g, g, g, g.

Итак, я хочу, чтобы словарь python добавлял значения двух a, a к dict ['a'] и g, g, g, g, g к dict ['g'] и так далее, как к dict [ 'b'] и т. д. Для выполнения цикла a, a, b, c, g, g, g, g, g будет выполнен цикл for for.

Надеюсь, я прояснил свой вопрос. Любая идея? Предпочтительно, если в словаре Python есть способ проверить существующий ключ.

EDIT

Кредит переходит к @Paul McGuire. Я выяснил точное решение, которое я хотел, основываясь на ответе @Paul McGuire. Как показано ниже:

from collections import defaultdict

class Test:
   def __init__(self, a,b):
       self.a=a
       self.b=b

data = []
data.append(Test(a=4,b=6))
data.append(Test(a=1,b=2))
data.append(Test(a=1,b=3))
data.append(Test(a=2,b=2))
data.append(Test(a=3,b=2))
data.append(Test(a=4,b=5))
data.append(Test(a=4,b=2))
data.append(Test(a=1,b=2))
data.append(Test(a=5,b=9))
data.append(Test(a=4,b=7))

dd = defaultdict(list)
for c in data:
    dd[c.a].append(c.b)
print dd

Ответы [ 7 ]

13 голосов
/ 29 декабря 2011

Старые подходы "if key in dict" или "dict.get" или "dict.setdefault" должны быть отложены в пользу ныне стандартного defaultdict:

data = "aabcggggg"

from collections import defaultdict
dd = defaultdict(list)
for c in data:
    dd[c].append(c)
print dd

defaultdictзаботится о проверке существования ключа, все, что должен сделать ваш код: 1) определить фабричную функцию или класс для defaultdict, который будет использоваться для инициализации новой записи ключа (в данном случае defaultdict(list)), и 2)определить, что делать с каждым ключом (dd[c].append(c)).Чисто, просто, без помех.

В вашем конкретном примере вы можете использовать itertools.groupby, так как все группы букв являются смежными для каждого значения группировки.groupby возвращает итератор кортежей, каждый из которых содержит текущее значение ключа и итератор совпадающих значений.Следующий код работает путем преобразования итератора списка значений каждого кортежа в фактический список (в list(v)) и передачи последовательности кортежей ключа-значения в конструктор dict.

from itertools import groupby
print dict((k,list(v)) for k,v in groupby(data))

print:

{'a': ['a', 'a'], 'c': ['c'], 'b': ['b'], 'g': ['g', 'g', 'g', 'g', 'g']}
5 голосов
/ 29 декабря 2011
my_dict = {}
my_dict.setdefault('sample', []).append(value)

второй параметр метода setdefault говорит, что должно быть начальным значением, если данный ключ не существует

4 голосов
/ 29 декабря 2011

Если я понимаю, ваши значения являются списками.

if 'sample' in mydict:
    pass #whatever  
else: 
    mydict['sample'] = [] 

Что вы хотите сделать, это следующее:

A = ['a','a','b','b','b','c','c','c']

myDict = {}
for i in A:
    if i not in myDict: 
        myDict[i] = []
    myDict[i].append(i) 
print myDict
2 голосов
/ 29 декабря 2011

Каждый ключ dict должен содержать список.Я прав?

d = dict()
try:
    d['sample'].append(new_data)
except KeyError:
    d['sample'] = [new_data]

Я верю, что это сработает.Кстати, вы не должны использовать имя dict для диктонары.dict уже используется как функция.

Edit1:

Я не совсем уверен, что понимаю, что вы пытаетесь сделать.Я также не знаю, является ли мое решение лучшим из предложенных.Но это то, что вы пытаетесь сделать?Кажется немного странным?Или вы хотите посчитать, сколько раз каждая буква встречается?

# Create a list named l.
l = ['a', 'a', 'b', 'c', 'g', 'g', 'g', 'g','g']

# Create dictionary named d.
d = dict()

for i in l:
    try:
        d[i].append(i)
    except KeyError:
        d[i] = [i]
0 голосов
/ 30 декабря 2011

Точное решение, которое я хотел больше всего, показано ниже. Кредит переходит к @Paul McGuire

from collections import defaultdict

class Test:
   def __init__(self, a,b):
       self.a=a
       self.b=b

data = []
data.append(Test(a=4,b=6))
data.append(Test(a=1,b=2))
data.append(Test(a=1,b=3))
data.append(Test(a=2,b=2))
data.append(Test(a=3,b=2))
data.append(Test(a=4,b=5))
data.append(Test(a=4,b=2))
data.append(Test(a=1,b=2))
data.append(Test(a=5,b=9))
data.append(Test(a=4,b=7))

dd = defaultdict(list)
for c in data:
    dd[c.a].append(c.b)
print dd
0 голосов
/ 29 декабря 2011

Надо отдать должное @Niclas Nilsson, хотя его опубликованное решение на самом деле не сработало для того, что я хотел, однако оно помогло мне найти решение, которое я хотел, в простейшей форме.

Тем не менее, я благодарен всем за помощь в получении дополнительных знаний и альтернативных способов их решения. Большое спасибо.

После чего достигнуто то, что я хотел, самым простым способом без дополнительной библиотеки, импортированной и т. Д .:

r = {}

try:
    if r['new_data']:
       r['new_data'] = 'appending'
except KeyError:
    r['new_data'] = 'new value'

print r['new_data']
0 голосов
/ 29 декабря 2011

Если вы используете очень старый Python:

if not myDict.has_key(key):
    myDict[key]=[val]
else:
    myDict[key].append(val)

Недавно has_key устарел в пользу key in dict Так что в настоящее время это будет:

if not key in myDict:
    myDict[key]=[val]
else:
    myDict[key].append(val)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...