2016-05-26 15 views
3

Sagen wir, ich habe zwei durch eine andere Funktion erzeugt Listen:Wie konvertiert man eine Liste mit doppelten Werten in ein Wörterbuch mit einer Liste als Wert?

test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]] 
test2 = [[1, 4], [4, 1]] 

Ich möchte, dass sie konvertieren Arrays für die schnelle Suche auf assoziative wie so:

test: {0: [1, 2], 1: [5,6], 2: [0], 3: [99, 98, 97]} 
test2: {1: [4], 4: [1]} 

ich es wie folgt tun:

def list_to_dict(my_list): 
    last_val = my_list[0][0] 
    temp = [] 
    my_dict = {} 

    for i in my_list: 
     if last_val == i[0]: 
      temp.append(i[1]) 
     else: 
      #add the values to this key 
      my_dict[last_val] = temp 
      #reset the list 
      temp = [] 
      temp.append(i[1]) 

     last_val = i[0] 
    my_dict[last_val] = temp 
    return my_dict 

Aber das ist nicht sehr Pythonic. Gibt es einen pythonischen Weg, dies zu erreichen?

Antwort

5

Verwendung collections.defaultdict:

>>> test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]] 
>>> 
>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> 
>>> for i, j in test: 
...  d[i].append(j) 
... 
>>> d 
defaultdict(<type 'list'>, {0: [1, 2], 1: [5, 6], 2: [0], 3: [99, 89, 79]}) 
0

Dies scheint ein perfekter Anwendungsfall für itertools.groupby:

test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]] 

import itertools 
d = {k:[t[1] for t in g] for k,g in itertools.groupby(test, key=lambda t: t[0])} 

print(d) 

Beachten Sie, dass groupby Arbeiten auf Iterables, und dass es gibt ein grouper Objekt standardmäßig. Die Ergebnisse sind:

{0: [1, 2], 1: [5, 6], 2: [0], 3: [99, 89, 79]} 
1

Sie auch diese durch Wörterbuch Gruppierung tun könnte, so etwas wie dieses:

def list_to_dict(my_list): 
     d = {} 

     for pair in my_list: 
      first = pair[0] 
      second = pair[1] 
      if first not in d: 
       d[first] = [] 
      d[first].append(second) 
     return d 

Oder Sie könnten setdefault() verwenden, wenn der Schlüssel nicht verfügbar ist:

def list_to_dict(my_list): 
     d = {} 
     for pair in my_list: 
      d.setdefault(pair[0], []).append(pair[1]) 
     return d 

    # Output 

    {0: [1, 2], 1: [5, 6], 2: [0], 3: [99, 89, 79]} 

Diese können leicht manipuliert werden, um defaultdict zu verwenden, wenn Sie möchten.

Verwandte Themen