Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

appropriate data structure for sorting a multi dimensional array in python?

I have three numeric values (weight, count, contribution) for various strings (words) that i would like to organise into one multidimensional array, and then sort. To do this, I made lists within a dictionary, where the numeric values are in the list and the string is the key:

print_dictionary[word] = [weight,count,contribution]

How can I sort, first in ascending order and then in descending order, by 'contribution' (the third value in the list), and show the first 10 items of the sorted list. How can I do this?

For example, for the following print_dictionary:

print_dictionary[sam] = [2,7,1]
print_dictionary[sun] = [4,1,3]
print_dictionary[dog] = [1,3,2]

I want to them be able to sort contribution in ascending order:

Word:   Weight:   Count:    Contribution:
sam     2         7         1
dog     1         3         2
sun     4         1         3

I don't see how itemegetter can be used for this:

sorted(print_dictionary, key=itemgetter(2))
like image 307
Zach Avatar asked Aug 18 '26 04:08

Zach


2 Answers

You can pass an anonymous function as the key to sorted. This uses the third member of the multi-dimensional dict as the key:

>>> d = {'a': [1, 4, 7], 'b': [2, 3, 9], 'c': [3, 2, 8]}
>>> for key in sorted(d, key=lambda x: d[x][2]):
...    print key, d[key]
a [1, 4, 7]
c [3, 2, 8]
b [2, 3, 9]

For descending order, use reverse=True. To limit the results, add [:N]:

sorted(d, key=lambda x: d[x][2], reverse=True)[:2]

# b [2, 3, 9]
# c [3, 2, 8]

More about sorted and sorting in Python.

like image 137
0eggxactly Avatar answered Aug 19 '26 18:08

0eggxactly


You can't really sort a dictionary; when you try, you are really just sorting the list of keys from the dictionary. You can do that using a custom sort comparison that looks at the third item in the value.

sorted(print_dictionary, key=lambda word: print_dictionary[word][2])

So to generate your report, something like this would work:

sorted_keys = sorted(print_dictionary, key=lambda word: print_dictionary[word][2])

print "Word:\tWeight:\tCount:\tContribution"      
for i in range(10): # or however many you want
    word = sorted_keys[i]
    values = print_dictionary[word]
    print "\t".join([word]+[str(n) for n in values])
like image 43
Mark Reed Avatar answered Aug 19 '26 18:08

Mark Reed



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!