Converting tuple of lists of variable length into dictionary

Beppe giuseppecostanzi at gmail.com
Sun Oct 18 09:04:59 EDT 2015


Il giorno domenica 18 ottobre 2015 14:47:34 UTC+2, Peter Otten ha scritto:
> Beppe wrote:
> 
> > Il giorno domenica 18 ottobre 2015 13:00:44 UTC+2, Peter Otten ha scritto:
> >> Beppe wrote:
> >> 
> >> > hi to everybody, I must turn a tuple of lists into a dictionary.
> >> > 
> >> > something like
> >> > 
> >> > (['a', 'b', 'c', 'd', 'e', 'f'], ['g', 'h', 'i'], ['l', 'm', 'n', 'o'])
> >> > 
> >> > note that the length af each list is variable
> >> > 
> >> > must return
> >> > 
> >> > a ['b', 'c', 'd', 'e', 'f']
> >> > b ['a', 'c', 'd', 'e', 'f']
> >> > c ['a', 'b', 'd', 'e', 'f']
> >> > d ['a', 'b', 'c', 'e', 'f']
> >> > e ['a', 'b', 'c', 'd', 'f']
> >> > f ['a', 'b', 'c', 'd', 'e']
> >> > g ['h', 'i']
> >> > h ['g', 'i']
> >> > i ['g', 'h']
> >> > l ['m', 'n', 'o']
> >> > m ['l', 'n', 'o']
> >> > n ['l', 'm', 'o']
> >> > o ['l', 'm', 'n']
> >> 
> >> What do you want to do with items that occur in more than one list?
> >> 
> >> If there are no such duplicate items it's easy:
> >> 
> >> >>> lists = (['a', 'b', 'c', 'd', 'e', 'f'], ['g', 'h', 'i'], ['l', 'm',
> >> 'n', 'o'])
> >> >>> d = {
> >> ... c: items[:i] + items[i+1:]
> >> ... for items in lists
> >> ... for i, c in enumerate(items)
> >> ... }
> >> >>> pprint.pprint(d)
> >> {'a': ['b', 'c', 'd', 'e', 'f'],
> >>  'b': ['a', 'c', 'd', 'e', 'f'],
> >>  'c': ['a', 'b', 'd', 'e', 'f'],
> >>  'd': ['a', 'b', 'c', 'e', 'f'],
> >>  'e': ['a', 'b', 'c', 'd', 'f'],
> >>  'f': ['a', 'b', 'c', 'd', 'e'],
> >>  'g': ['h', 'i'],
> >>  'h': ['g', 'i'],
> >>  'i': ['g', 'h'],
> >>  'l': ['m', 'n', 'o'],
> >>  'm': ['l', 'n', 'o'],
> >>  'n': ['l', 'm', 'o'],
> >>  'o': ['l', 'm', 'n']}
> > 
> > hi Peter, you are right, no duplicates are admitted between lists,
> > anyway your solution,works on python 3 but not on 2.
> > however beautiful list comprehension solution.
> > I will try to suit it for the python version i need
> 
> The above code will work without changes in Python 2.7. For older Python 
> versions you can replace the dict comprehension with a generator expression:
> 
> >>> d = dict(
> ... (c, items[:i] + items[i+1:])
> ... for items in lists
> ... for i, c in enumerate(items)
> ... )
> >>> pprint.pprint(d)
> {'a': ['b', 'c', 'd', 'e', 'f'],
>  'b': ['a', 'c', 'd', 'e', 'f'],
>  'c': ['a', 'b', 'd', 'e', 'f'],
>  'd': ['a', 'b', 'c', 'e', 'f'],
>  'e': ['a', 'b', 'c', 'd', 'f'],
>  'f': ['a', 'b', 'c', 'd', 'e'],
>  'g': ['h', 'i'],
>  'h': ['g', 'i'],
>  'i': ['g', 'h'],
>  'l': ['m', 'n', 'o'],
>  'm': ['l', 'n', 'o'],
>  'n': ['l', 'm', 'o'],
>  'o': ['l', 'm', 'n']}
> 
> I have no Python below 2.7 ready to test, but this version should work for 
> Python 2.4 and above. If you find explict loops easier to understand:
> 
> >>> d = {}
> >>> for items in lists:
> ...     for i, c in enumerate(items):
> ...             assert c not in d
> ...             d[c] = items[:i] + items[i+1:]
> ... 
> 
> should work for Python 2.3 and above (untested). I have smuggled in an 
> assertion that checks for duplicate keys.

spectacular...:)
both version work fine on 2.6
I'm shooting 'print' everywhere to understand what are you do...
thank you very much
ciao
beppe



More information about the Python-list mailing list