Zamiana słownika na listę

0

Piszę program który ma za zadanie zrobić kodowanie Huffmana. Całe kodowanie itd ograniam mam tylko jeden problem. Na początku literę I częstość zapisuje w słowniku ( najpierw litera, potem częstość) który chce potem przekonwertowac na listę tupli (częstość, litera). Próbowałam 10 wersji tego I każda wyrzuca mi błąd. Czy ktoś mógłby podrzucić pomysł jak to zrobić?

0
>>> d = {'a': 1, 'b': 2, 'c': 3}

>>> [(v, k) for k, v in d.items()]
[(1, 'a'), (2, 'b'), (3, 'c')]

>>> list(zip(d.values(), d.keys()))
[(1, 'a'), (2, 'b'), (3, 'c')]

>>> 
0

Ewentualnie jeszcze:
[tuple(item) for item in d.items()], czyli list(d.items())
wydaje mi się prostym zapisem
chociaż może dla twojego zastosowania wystarczy d.items() po prostu?

0
#!/usr/bin/env python3

from collections import Counter

msg = "abrakadabra i wielkie napisy bez istotnego sensu"

counter = Counter(msg)
for k, v in counter.items():
    print(k, v)
2

Ogólnie to rozwiązanie kolegi @Mózg z pierwszego posta jest wyczerpujące. Dodam od siebie tylko jeszcze jeden sposób (nie najlepszy patrząc po rezultatach poniżej):

bpython version 0.15 on top of Python 3.5.2 /usr/bin/python
>>> import timeit

>>> d = {'a': 1, 'b': 2, 'c': 3} #~ Mózg
>>> def test_vk():
...     return [(v,k) for k, v in d.items()]
>>> def test_zip():
...     return list(zip(d.values(), d.keys()))
>>> def test_slice():
...     return [tpl[::-1] for tpl in d.items()]

>>> testvk()
[(3, 'c'), (2, 'b'), (1, 'a')]
>>> test_zip()
[(3, 'c'), (2, 'b'), (1, 'a')]
>>> test_slice()
[(3, 'c'), (2, 'b'), (1, 'a')]

>>> timeit.timeit(test_vk, number=10**6)
0.5528497270133812
>>> timeit.timeit(test_zip, number=10**6)
0.764390138007002
>>> timeit.timeit(test_slice, number=10**6)
0.6742167519987561

Pierwszy sposób zadziała najszybciej dla małego słownika, i zakładając że ktoś dojrzy że klucz i wartość są odwrócone, z czytelnością nie będzie problemu :)

>>> d = {i: j for i,j in zip("abcdefghijklmnoprstuwxyz", "abcdefghijklmnoprstuwxyz")}
>>> d
{'l': 'l', 'x': 'x', 'u': 'u', 't': 't', 'r': 'r', 'e': 'e', 'g': 'g', 'z': 'z', 'a': 'a', 'n': 'n', 'p': 'p', 'm': 'm', 'b': 'b', 'o': 'o',
 'k': 'k', 'i': 'i', 'j': 'j', 'c': 'c', 'w': 'w', 'd': 'd', 'y': 'y', 'h': 'h', 'f': 'f', 's': 's'}
>>> timeit.timeit(test_vk, number=10**6)
1.7868151589937042
>>> timeit.timeit(test_zip, number=10**6)
1.408359158987878
>>> timeit.timeit(test_slice, number=10**6)
3.1247198749915697

slice które zaproponowałem, całkowicie dają nogę dla samego alfabetu :). Jednak zip wychodzi już lepiej.

>>> d = {str(i):j for i,j in zip(range(200), range(200))}
>>> timeit.timeit(test_vk, number=10**5) #~Zmieniłem na 10^5 aby nie czekać.
1.2886227389972191
>>> timeit.timeit(test_zip, number=10**5)
0.8408215300005395
>>> timeit.timeit(test_slice, number=10**5)
2.4907565060129855

I jak wychodzi, im większy zbiór, tym lepiej się sprawuje zip, więc wiadomo gdzie stosować :).

1 użytkowników online, w tym zalogowanych: 0, gości: 1