dict generator question

Gerard flanagan grflanagan at gmail.com
Thu Sep 18 15:09:59 EDT 2008


George Sakkis wrote:
> On Sep 18, 11:43 am, Gerard flanagan <grflana... at gmail.com> wrote:
>> Simon Mullis wrote:
>>> Hi,
>>> Let's say I have an arbitrary list of minor software versions of an
>>> imaginary software product:
>>> l = [ "1.1.1.1", "1.2.2.2", "1.2.2.3", "1.3.1.2", "1.3.4.5"]
>>> I'd like to create a dict with major_version : count.
>>> (So, in this case:
>>> dict_of_counts = { "1.1" : "1",
>>>                    "1.2" : "2",
>>>                    "1.3" : "2" }
>> [...]
>> data = [ "1.1.1.1", "1.2.2.2", "1.2.2.3", "1.3.1.2", "1.3.4.5"]
>>
>> from itertools import groupby
>>
>> datadict = \
>>    dict((k, len(list(g))) for k,g in groupby(data, lambda s: s[:3]))
>> print datadict
> 
> Note that this works correctly only if the versions are already sorted
> by major version.
> 

Yes, I should have mentioned it. Here's a fuller example below. There's 
maybe better ways of sorting version numbers, but this is what I do.


data = [ "1.2.2.2", "1.2.2.3", "1.3.1.2", "1.1.1.1", "1.3.14.5", 
"1.3.21.6" ]

from itertools import groupby
import re

RXBUILDSORT = re.compile(r'\d+|[a-zA-Z]')

def versionsort(s):
     key = []
     for part in RXBUILDSORT.findall(s.lower()):
         try:
             key.append(int(part))
         except ValueError:
             key.append(ord(part))
     return tuple(key)

data.sort(key=versionsort)
print data

datadict = \
dict((k, len(list(g))) for k,g in groupby(data, lambda s: s[:3]))
print datadict







More information about the Python-list mailing list