Python: преобразовать этот список в словарь - PullRequest
2 голосов
/ 18 октября 2010

У меня проблема, и я не знаю, как кодировать на python.

У меня есть list[10, 10, 10, 20, 20, 20, 30]

Я хочу, чтобы это было в словаре, подобном этому

{"10": 1, "20":  3, "30" : 1}

Как мне этого добиться?

Ответы [ 4 ]

15 голосов
/ 18 октября 2010
from collections import Counter
a = [10, 10, 10, 20, 20, 20, 30]
c = Counter(a)
# Counter({10: 3, 20: 3, 30: 1})

Если вы действительно хотите преобразовать ключи в строки, это отдельный шаг:

dict((str(k), v) for k, v in c.iteritems())

Этот класс является новым для Python 2.7; для более ранних версий используйте эту реализацию:

http://code.activestate.com/recipes/576611/


Редактировать: Отбросив это здесь, так как SO не позволит мне вставить код в комментарии,

from collections import defaultdict
def count(it):
    d = defaultdict(int)
    for j in it:
        d[j] += 1
    return d
4 голосов
/ 18 октября 2010

Другой способ, который не использует set или Counter:

d = {}
x = [10, 10, 10, 20, 20, 20, 30]
for j in x:
    d[j] = d.get(j,0) + 1

РЕДАКТИРОВАТЬ: Для списка размером 1000000 с 100 уникальными предметами этот метод работает на моем ноутбуке в течение 0,37 сек, в то время какответ с использованием set занимает 2,59 сек.Только для 10 уникальных предметов первый метод занимает 0,36 с, а второй - только 0,25 с.

РЕДАКТИРОВАТЬ: метод с использованием defaultdict занимает 0,18 с на моем ноутбуке.

1 голос
/ 18 октября 2010

в Python> = 2.7 вы можете использовать dict-понимания, например:

>>> l = [10, 10, 10, 20, 20, 20, 30]
>>> {x: l.count(x) for x in l}
{10: 3, 20: 3, 30: 1}

не самый быстрый способ, но вполне подходит для небольших списков

ОБНОВЛЕНИЕ

или, вдохновленный инспектором G4dget, это лучше:

{x: l.count(x) for x in set(l)}
1 голос
/ 18 октября 2010

Как это

l = [10, 10, 10, 20, 20, 20, 30]
uniqes = set(l)
answer = {}
for i in uniques:
    answer[i] = l.count(i)

answer теперь словарь, который вы хотите

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

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