Domanda

I am running python 2.7.2 on a mac.

I have a simple dictionary:

dictionary= {a,b,c,a,a,b,b,b,b,c,a,w,w,p,r}

I want it to be printed and have the output like this:

Dictionary in alphabetical order:
    a  4
    b  5
    c  2
    p  1
    r  1
    w  2

But what I'm getting is something like this...

a  1
a  1
a  1
a  1
b  1
.
.
.
w  1

This is the code I am using.

new_dict = []


    for word in dictionary.keys():
        value = dictionary[word]
        string_val = str(value)
        new_dict.append(word + ": " + string_val)

    sorted_dictionary = sorted(new_dict)

    for entry in sorted_dictionary:
        print entry

Can you please tell me where is the mistake? (By the way, I'm not a programmer but a linguist, so please go easy on me.)

È stato utile?

Soluzione

What you're using is not a dictionary, it's a set! :)

And sets doesn't allow duplicates.

What you probably need is not dictionaries, but lists.

A little explanation

Dictionaries have keys, and each unique keys have their own values:

my_dict = {1:'a', 2:'b', 3:'c'} 

You retrieve values by using the keys:

>>> my_dict [1]
'a'

On the other hand, a list doesn't have keys.

my_list = ['a','b','c']

And you retrieve the values using their index:

>>> my_list[1]
'b'

Keep in mind that indices starts counting from zero, not 1.

Solving The Problem

Now, for your problem. First, store the characters as a list:

l = ['a', 'b', 'c', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'a', 'w', 'w', 'p', 'r']

Next, we'll need to know what items are in this list:

items = []
for item in l:
    if item not in items:
        items.append(item)

This is pretty much equal to items = set(l) (the only difference is that this is a list). But just to make things clear, hope you understand what the code does.

Here is the content of items:

>>> items
['a', 'b', 'c', 'w', 'p', 'r']

With that done, we will use lst.count() method to see the number of a char's occurence in your list, and the built-in function sorted() to sort the items:

for item in sorted(items): #iterates through the sorted items.
    print item, l.count(item)

Result:

a 4
b 5
c 2
w 2
p 1
r 1

Hope this helps!!

Altri suggerimenti

Let's start with the obvious, this:

dictionary= {a,b,c,a,a,b,b,b,b,c,a,w,w,p,r}

is not a dictionary. It is a set, and sets do not preserve duplicates. You probably meant to declare that as a list or a tuple.

Now, onto the meat of your problem: you need to implement something to count the items of your collection. Your implementation doesn't really do that. You could roll your own, but really you should use a Counter:

my_list = ['a','b','c','a','a','b','b','b','b','c','a','w','w','p','r']

from collections import Counter

c = Counter(my_list)

c
Out[19]: Counter({'b': 5, 'a': 4, 'c': 2, 'w': 2, 'p': 1, 'r': 1})

Now on to your next problem: dictionaries (of all types, including Counter objects) do not preserve key order. You need to call sorted on the dict's items(), which is a list of tuples, then iterate over that to do your printing.

for k,v in sorted(c.items()):
    print('{}: {}'.format(k,v))

a: 4
b: 5
c: 2
p: 1
r: 1
w: 2

dictionary is something like this{key1:content1, key2:content2, ...} key in a dictionary is unique. then a = {1,2,3,4,5,5,4,5,6} is the set, when you print this out, you will notice that

print a
set([1,2,3,4,5,6])

duplicates are eliminated.

In your case, a better data structure you can use is a list which can hold multiple duplicates inside.

if you want to count the element number inside, a better option is collections.Counter, for instance:

import collections as c
cnt = c.Counter()
dict= ['a','b','c','a','a','b','b','b','b','c','a','w','w','p','r']
for item in dict:
    cnt[item]+=1
print cnt

the results would be:

Counter({'b': 5, 'a': 4, 'c': 2, 'w': 2, 'p': 1, 'r': 1})

as you notice, the results become a dictionary here.

so by using:

for key in cnt.keys():
    print key, cnt[key]

you can access the key and content

a 4
c 2
b 5
p 1
r 1
w 2

you can achieve what you want by modifying this a little bit. hope this is helpful

  1. Dictionary cannot be defined as {'a','b'}. If it defined so, then it is an set, where you can't find duplicates in the list
  2. If your defining a character, give it in quotes unless it is declared already.
  3. You can't loop through like this for word in dictionary.keys():, since here dictionary is not a dictionary type.

If you like to write a code without using any builtin function, try this

input=['a','b','c','a','a','b','b','b','b','c','a','w','w','p','r']
dict={}
for x in input:
        if x in dict.keys():
                dict[x]=dict[x]+1
        else:
                dict[x]=1

for k in dict.keys():
    print k, dict[k]

First, a dictionary is an unordered collection (i.e., it has no guaranteed order of its keys).

Second, each dict key must be unique.

Though you could count the frequency of characters using a dict, there's a better the solution. The Counter class in Python's collections module is based on a dict and is specifically designed for a task like tallying frequency.

from collections import Counter

letters = ['a', 'b', 'c', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'a', 'w', 'w', 'p', 'r']
cnt = Counter(letters)
print cnt

The contents of the counter are now:

Counter({'b': 5, 'a': 4, 'c': 2, 'w': 2, 'p': 1, 'r': 1})

You can print these conveniently:

for char, freq in sorted(cnt.items()): 
    print char, freq

which gives:

a 4
b 5
c 2
p 1
r 1
w 2
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top