Python Итерация по двум спискам только по последнему элементу - PullRequest
0 голосов
/ 14 ноября 2018

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

l = [['<s>', 'a', 'a', 'b', 'b', 'c', 'c', '</s>'], ['<s>', 'a', 'c', 'b', 'c', '</s>'], ['<s>', 'b', 'c', 'c', 'a', 'b', '</s>']]

dict = {}

for words in l:
    for letters in words:
        dict[letters] = words.count(letters)


for x in countVocabDict:
        print(x + ":" + str(countVocabDict[x]))

в данный момент я получаю:

<s>:1
a:1
b:2
c:2
</s>:1

Кажется, что он только повторяется черезпоследний список в 'l' : ['<s>', 'b', 'c', 'c', 'a', 'b', '</s>']

но я пытаюсь получить:

<s>: 3
a: 4
b: 5
c: 6
</s>:3

Ответы [ 4 ]

0 голосов
/ 15 ноября 2018

По вашему вопросу вы, похоже, знаете, что он принимает только результат последнего подсписка.Это происходит потому, что после каждой итерации ваши предыдущие значения словаря заменяются и перезаписываются значениями следующей итерации.Итак, вам нужно сохранить предыдущие значения состояний и добавить их к вновь рассчитанным значениям.

Вы можете попробовать это -

l = [['<s>', 'a', 'a', 'b', 'b', 'c', 'c', '</s>'], ['<s>', 'a', 'c', 'b', 'c', '</s>'], ['<s>', 'b', 'c', 'c', 'a', 'b', '</s>']]
d={}
for lis in l:
    for x in lis:
        if x in d:
            d[x]+=1
        else:
            d[x]=1

Таким образом, результирующий словарь d будет иметь вид -

{'<s>': 3, 'a': 4, 'c': 6, 'b': 5, '</s>': 3}

Надеюсь, это поможет!

0 голосов
/ 14 ноября 2018

В каждом внутреннем цикле for вы не добавляете к текущему значению dict[letters], а устанавливаете его на любое значение, подсчитываемое для текущего подсписка (как правило) с именем word.

Исправление вашего кода с помощью ванили dict:

>>> l = [['<s>', 'a', 'a', 'b', 'b', 'c', 'c', '</s>'], ['<s>', 'a', 'c', 'b', 'c', '</s>'], ['<s>', 'b', 'c', 'c', 'a', 'b', '</s>']]
>>> d = {}                                                                  
>>>
>>> for sublist in l: 
...:     for x in sublist: 
...:         d[x] = d.get(x, 0) + 1 
>>> d                                                                       
{'<s>': 3, 'a': 4, 'b': 5, 'c': 6, '</s>': 3}

Обратите внимание, что я не вызываю list.count в каждом внутреннем цикле for. Вызов count будет повторять весь список снова и снова. Гораздо эффективнее просто добавлять 1 каждый раз, когда значение просматривается, что можно сделать, посмотрев на каждый элемент (под) списков ровно один раз.

Использование Counter.

>>> from collections import Counter                                         
>>> Counter(x for sub in l for x in sub)                                    
Counter({'<s>': 3, 'a': 4, 'b': 5, 'c': 6, '</s>': 3})

Использование Counter без ручного удаления вложенного списка:

>>> from collections import Counter                                         
>>> from itertools import chain                                        
>>> Counter(chain.from_iterable(l))                                         
Counter({'<s>': 3, 'a': 4, 'b': 5, 'c': 6, '</s>': 3})
0 голосов
/ 14 ноября 2018

Как сказал @Vishnudev, вы должны добавить текущий счетчик. Но dict[letters] должен существовать (иначе вы получите исключение KeyError). Вы можете использовать метод dict get со значением по умолчанию, чтобы избежать этого:

l = [['<s>', 'a', 'a', 'b', 'b', 'c', 'c', '</s>'], 
     ['<s>', 'a', 'c', 'b', 'c', '</s>'], 
     ['<s>', 'b', 'c', 'c', 'a', 'b', '</s>']]

dict = {}
for words in l:
    for letters in words:
        dict[letters] = dict.get(letters, 0) + 1
0 голосов
/ 14 ноября 2018

Словарь перезаписывается на каждой итерации, скорее он должен обновляться

count_dict[letters] += words.count(letters)

Инициализировать словарь с defaultdict

from collections import defaultdict
count_dict = defaultdict(int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...