Подсчитайте, сколько раз элемент встречается в каждом вложенном списке - PullRequest
0 голосов
/ 09 ноября 2018

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

scores = [["win","lose","win"],["win","win"],["draw","win"],["lose"]]

И я хочу получить счет 'win' / 'lose' / 'draw' для каждого подсписка

Могу ли я сделать это, используя словарь?

например. dict= {[win:2, draw:0, lose:1],[win:2, draw:0, lose:0].....}

Я попытался сосчитать и поместить в список, выполнив следующее:

countlose=0
for sublist in scores:
    for item in sublist:
        for item in range(len(sublist)):
            if item=="lose":
                countlose+=1
print(countlose)

Но это только что вернулось 0

Дайте мне знать, как вы решите проблему

Ответы [ 3 ]

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

Вы можете применить понимание списка для каждого sublist из вашего списка.

Кроме того, объявите свою собственную функцию counter, которая подсчитывает количество появлений одного элемента из win, lose или draw.

scores = [["win","lose","win"],["win","win"],["draw","win"],["lose"]]
def get_number(sublist):
  counter = {'win': 0, 'draw' : 0, 'lose': 0}
  for item in sublist:
    counter[item] += 1
  return counter

result = [get_number(sublist) for sublist in scores]

выход

[{'win': 2, 'draw': 0, 'lose': 1}, 
 {'win': 2, 'draw': 0, 'lose': 0}, 
 {'win': 1, 'draw': 1, 'lose': 0}, 
 {'win': 0, 'draw': 0, 'lose': 1}]
0 голосов
/ 09 ноября 2018

Ваш желаемый результат не правильный синтаксис. Скорее всего, вам нужен список словарей.

collections.Counter считает только значения в итерируемых; он не учитывает внешние ключи, если вы не предоставите дополнительную логику.

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

from collections import Counter

scores = [["win","lose","win"],["win","win"],["draw","win"],["lose"]]

empty = dict.fromkeys(('win', 'lose', 'draw'), 0)

res = [{**empty, **Counter(i)} for i in scores]

[{'draw': 0, 'lose': 1, 'win': 2},
 {'draw': 0, 'lose': 0, 'win': 2},
 {'draw': 1, 'lose': 0, 'win': 1},
 {'draw': 0, 'lose': 1, 'win': 0}]
0 голосов
/ 09 ноября 2018

Могу ли я сделать это, используя словарь?

Вы можете использовать collections.Counter, который является подклассом dict для подсчета хеш-объектов:

>>> from collections import Counter
>>> scores = [['win', 'lose', 'win'], ['win', 'win'], ['draw', 'win'], ['lose']]
>>> counts = [Counter(score) for score in scores]
>>> counts
[Counter({'win': 2, 'lose': 1}), Counter({'win': 2}), Counter({'draw': 1, 'win': 1}), Counter({'lose': 1})]

Чтобы добавить ноль отсчетов для отсутствующих ключей, вы можете использовать дополнительный цикл:

>>> for c in counts:
...     for k in ('win', 'lose', 'draw'):
...         c[k] = c.get(k, 0)
... 
>>> counts
[Counter({'win': 2, 'lose': 1, 'draw': 0}), Counter({'win': 2, 'lose': 0, 'draw': 0}), Counter({'draw': 1, 'win': 1, 'lose': 0}), Counter({'lose': 1, 'win': 0, 'draw': 0})]

Кроме того, вы можете обернуть счетчики с помощью collections.defaultdict:

>>> counts = [defaultdict(int, Counter(score)) for score in scores]
>>> counts
[defaultdict(<class 'int'>, {'win': 2, 'lose': 1}), defaultdict(<class 'int'>, {'win': 2}), defaultdict(<class 'int'>, {'draw': 1, 'win': 1}), defaultdict(<class 'int'>, {'lose': 1})]
>>> counts[0]['draw']
0
...