как вставить значения в список в Python .. с несколькими дополнительными условиями - PullRequest
1 голос
/ 13 апреля 2011

привет, у меня есть список таких кортежей:

биграммы = [(«богатство», «выигрыш»), («выигрыш», «сожженный»), («сожженный», «воля»), («воля», «огонь»)]

и я хочу добавить каждый отдельный кортеж в словарь в качестве ключа словаря.

Я хочу, чтобы формат выглядел следующим образом.

dict = {"wealth-gain": value, "gain-burnt": value ......} 

как создать цикл, который будет проходить через каждый кортеж в списке биграмм и добавлять его в словарь?

Вот что у меня есть

For word in bigrams:
    dict[(0+"-"+1) = dict

В основном, я хочу взять каждый кортеж и добавить "-" между каждым словом в кортеже, а затем добавить его в словарь?

Есть идеи, как это сделать?

Также, если биграмма, которая будет добавлена ​​в словарь, совпадает с биграммой, которая уже есть в словаре, я бы не хотела добавлять этот биграмм в словарь. Скорее я хотел бы увеличить значение биграммы уже в словаре. Есть идеи как это сделать?

Спасибо.

Ответы [ 5 ]

4 голосов
/ 13 апреля 2011

Вы можете использовать метод join:

bigrams = [ ('wealth', 'gain'), ('gain', 'burnt'), ('burnt', 'will'), ('will', 'fire') ]
dict_ = {}
for tup in bigrams:
    k = '-'.join(tup)
    dict_[k] = data.setdefault(k,0) + 1

или выполнить инициализацию с помощью генератора:

bigrams = [ ('wealth', 'gain'), ('gain', 'burnt'), ('burnt', 'will'), ('will', 'fire') ]
dict_ = dict(('-'.join(tup), 0) for tup in bigrams)
1 голос
/ 13 апреля 2011

Вы можете использовать кортежи в списке непосредственно как словарные ключи - вам не нужно объединять их в одну строку. В Python 2.7 это становится особенно удобным в сочетании с collections.Counter:

from collections import Counter
bigrams = [('wealth', 'gain'), ('gain', 'burnt'),
           ('burnt', 'will'), ('will', 'fire')]
counts = Counter(bigrams)
print counts

печать

Counter({('gain', 'burnt'): 1, ('will', 'fire'): 1, ('wealth', 'gain'): 1, ('burnt', 'will'): 1})
1 голос
/ 13 апреля 2011

Как насчет:

d = {}
val = 0
bigrams = [ ('wealth', 'gain'), ('gain', 'burnt'), ('burnt', 'will'), ('will', 'fire') ]
for word in bigrams:
    s = '-'.join(word)
    if s in d:
        d[s] += 1
    else:
        d[s] = val
0 голосов
/ 13 апреля 2011

попробуйте это:

bigrams = [ ('wealth', 'gain'), ('gain', 'burnt'), ('burnt', 'will'), ('will', 'fire') ]
bigram_dict = {}
for bigram in bigrams:
    key = '-'.join(bigram)
    if key in bigram_dict:
        bigram_dict[key] += 1
    else:
        bigram_dict[key] = 1

также я чувствую себя обязанным указать, что это не биграммы ни в каком виде, ни в форме, ни в форме.Я не совсем уверен, что вы хотите сказать, но они, конечно, не биграммы!

0 голосов
/ 13 апреля 2011

Вы должны ознакомиться с пониманием списка.Это облегчает преобразование первого списка:

bigrams = [x+"-"+y for x,y in bigrams]

Теперь посмотрим на метод setdefault dict и используйте его так:

data = {} # dict встроенпоэтому не используйте его в качестве имени переменной

for bigram in bigrams:
    data[bigram] = data.setdefault(bigram,0) + 1

Если вы хотите иметь еще более сжатую версию, вы можете взглянуть на модуль itertools.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...