Pythonic способ выполнения цикла в словаре списков - PullRequest
0 голосов
/ 09 ноября 2018

Этот код работает, но мне было интересно, есть ли более питонский способ его написания.

word_frequency - словарь списков, например ::1004 *

word_frequency = {'dogs': [1234, 4321], 'are': [9999, 0000], 'fun': [4389, 3234]}

vocab_frequency = [0, 0] # stores the total times all the words used in each class
for word in word_frequency: # that is not the most elegant solution, but it works!
    vocab_frequency[0] += word_frequency[word][0] #negative class
    vocab_frequency[1] += word_frequency[word][1] #positive class

Есть ли более элегантный способ написания этого цикла?

Ответы [ 9 ]

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

Попробуйте это решение в одну строку:

[sum([word_frequency[i][0] for i in word_frequency]),sum([word_frequency[i][1] for i in word_frequency])]
0 голосов
/ 09 ноября 2018
for n, p in your_dict.vales():
    res[0] += n
    res[1] += p

Это будет достаточно быстро и элегантно. Отправлено с телефона. Извините за формат.

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

Вероятно, не самый короткий способ решить эту проблему, но, надеюсь, самый понятный ...

word_frequency = {'dogs': [1234, 4321], 'are': [9999, 0000], 'fun': [4389, 3234]}

negative = (v[0] for v in word_frequency.values())
positive = (v[1] for v in word_frequency.values())
vocab_frequency = sum(negative), sum(positive)

print (vocab_frequency)  # (15622, 7555)

Хотя более опытные Pythonistas могут использовать zip для распаковки значений:

negative, positive = zip(*word_frequency.values())
vocab_frequency = sum(negative), sum(positive)
0 голосов
/ 09 ноября 2018

Вы можете преобразовать этот словарь в pandas DataFrame, и с ним будет намного проще работать.

import pandas as pd
word_frequency = {'dogs': [1234, 4321], 'are': [9999, 0000], 'fun': [4389, 3234]}

#Syntax to create DataFrame
df = pd.DataFrame(word_frequency)

#Result
   dogs   are   fun
0  1234  9999  4389
1  4321     0  3234

Теперь просто возьмите сумму каждой строки и либо преобразуйте обратно в список, либо сохраните как объект данных.

#Take sum of each row and convert to list
df = df.sum(axis=1)
df = df.values.tolist()
print(df)

#Output
[15622, 7555]
0 голосов
/ 09 ноября 2018
list(map(sum, zip(*word_frequency.values())))
0 голосов
/ 09 ноября 2018
for frequencies in word_frequency.values():
    vocab_frequency = [sum(x) for x in zip(vocab_frequency, frequencies)] 
0 голосов
/ 09 ноября 2018

Другой подход был бы такой:

vocab_frequency[0], vocab_frequency[1] = list(sum([word_frequency[elem][i] for elem in word_frequency]) for i in range(2))

print(vocab_frequency[0])
print(vocab_frequency[1])

Вывод:

15622
7555

Тем не менее, еще один способ сделать это, вроде как надуманный это:

*vocab_frequency, = list(map(sum,zip(*word_frequency.values())))

print(vocab_frequency)

Вывод:

[15622, 7555]
0 голосов
/ 09 ноября 2018

Вы можете использовать numpy для этого:

import numpy as np

word_frequency = {'dogs': [1234, 4321], 'are': [9999, 0000], 'fun': [4389, 3234]}
vocab_frequency = np.sum(list(word_frequency.values()), axis=0)
0 голосов
/ 09 ноября 2018

Я не уверен, что это больше Pythonic:

>>> word_frequency = {'dogs': [1234, 4321], 'are': [9999, 0000], 'fun': [4389, 3234]}
>>> vocab_frequency = [sum(x[0] for x in word_frequency.values()),
                       sum(x[1] for x in word_frequency.values())]
>>> print(vocab_frequency)
[15622, 7555]

Альтернативный раствор с reduce:

>>> reduce(lambda x, y: [x[0] + y[0], x[1] + y[1]], word_frequency.values())
[15622, 7555]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...