Как посчитать частоту такого списка, используя библиотеки basi c? - PullRequest
1 голос
/ 31 января 2020

Список выглядит так, что имеет символ ascii и числовое значение. Я хочу подсчитать вхождение каждого из символов ASCII для 0, 1 и 2. Таким образом, для A {0 = 10, 1 = 2, 2 = 12} также

[('P', 0),
 ('S', 2),
 ('R', 1),
 ('O', 1),
 ('J', 1),
 ('E', 1),
 ('C', 1),
 ('T', 1),
 ('G', 1),
 ('U', 1),
 ('T', 1),
 ('E', 1),
 ('N', 1)]

Я пробовал

char_freq = {c:[0,0,0] for c in string.ascii_uppercase}

также

for i in range(3):
  for x,i in a:
    print(x,i)

Я хочу посчитать X для i, где X - [AZ] Это должно дать мне результат, как Character | 0 | 1 | 2 A 10 5 4

Ответы [ 3 ]

1 голос
/ 31 января 2020
from collections import Counter

l = [('A', 1),
 ('A', 1),
 ('A', 2),
 ('A', 2),
 ('B', 1),
 ('B', 2),
 ('B', 3),
 ('B', 4)]

data = {}
for k,v in l:
    data[k] = [v] if k not in data else data[k] + [v]

char_freq = {k: dict(Counter(v)) for k, v in data.items()}
print(char_freq)

Выходы:

{'A': {1: 2, 2: 2}, 'B': {1: 1, 2: 1, 3: 1, 4: 1}}
1 голос
/ 31 января 2020

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

from collections import Counter
import pandas as pd

l = [('P', 0),
     ('S', 2),
     ('R', 1),
     ('O', 1),
     ('J', 1),
     ('E', 1),
     ('C', 1),
     ('T', 1),
     ('G', 1),
     ('U', 1),
     ('T', 1),
     ('E', 1),
     ('N', 1)]

df = pd.DataFrame(l)
counts = df.groupby(0)[1].agg(Counter)

возвращает:

C    {1: 1}
E    {1: 2}
G    {1: 1}
J    {1: 1}
N    {1: 1}
O    {1: 1}
P    {0: 1}
R    {1: 1}
S    {2: 1}
T    {1: 2}
U    {1: 1}

это даст вам каждый символ ASCII, а также каждый уникальный номер и количество вхождений каждого числа

0 голосов
/ 02 февраля 2020

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

char_freq = {c: {0: 0, 1: 0, 2: 0} for c in string.ascii_uppercase}
for x, i in a:
    char_freq[x][i] += 1

, чтобы избежать использования всего алфавита в вашем char_freq, который вы могли бы использовать только необходимые символы:

char_freq = {c: {0: 0, 1: 0, 2: 0} for c in {t[0] for t in a}}
for x, i in a:
    char_freq[x][i] += 1 

вывод:

{'O': {0: 0, 1: 1, 2: 0},
 'T': {0: 0, 1: 2, 2: 0},
 'N': {0: 0, 1: 1, 2: 0},
 'G': {0: 0, 1: 1, 2: 0},
 'U': {0: 0, 1: 1, 2: 0},
 'E': {0: 0, 1: 2, 2: 0},
 'J': {0: 0, 1: 1, 2: 0},
 'R': {0: 0, 1: 1, 2: 0},
 'C': {0: 0, 1: 1, 2: 0},
 'S': {0: 0, 1: 0, 2: 1},
 'P': {0: 1, 1: 0, 2: 0}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...