2017-08-27 3 views

Antwort

2

Einfacher Ansatz:

data = [['cat', 'animal'], ['dog', 'animal'], ['crow', 'bird']] 

result = {} 

for value, key in data: 
    result[key] = result.get(key, []) + [value] 

result #=> {'bird': ['crow'], 'animal': ['cat', 'dog']} 

Mit defaultdict:

from collections import defaultdict 

data = [['cat', 'animal'], ['dog', 'animal'], ['crow', 'bird']] 

result = defaultdict(list) 

for value, key in data: 
    result[key].append(value) 

result #=> defaultdict(<class 'list'>, {'animal': ['cat', 'dog'], 'bird': ['crow']}) 

Mit groupby von itertools:

from itertools import groupby 

data = [['cat', 'animal'], ['dog', 'animal'], ['crow', 'bird']] 

{k: [x[0] for x in g] for k, g in groupby(data, lambda x: x[1])} 
#=> {'bird': ['crow'], 'animal': ['cat', 'dog']} 

Mit reduce von functools:

from functools import reduce 

data = [['cat', 'animal'], ['dog', 'animal'], ['crow', 'bird']] 

reduce(lambda a, e: dict(a, **{e[1]: a.get(e[1], []) + [e[0]]}), data, {}) 
#=> {'bird': ['crow'], 'animal': ['cat', 'dog']} 
+0

Danke für die Hilfe, die ich mit dem Standarddict Ansatz, der perfekt funktioniert hat und die anderen Ansätze sind auch sehr interessant. –

1

Wenn Sie eine Liste von Listen, die Sie konvertieren möchten, können Sie dies tun:

dict1 = {} 
for li in lists: 

    if(li[1] not in dict1): 
     dict1[li[1]] = [] 

    dict1[li1].append(li[0]) 

Beachten Sie, dass diese dict1={'animal':['cat','dog'],'bird':['crow']} produzieren statt dict1={'animal':['cat','dog'],'bird':'crow'}, das ist, was man in der Frage haben.

1

Sie können das defaultdict aus dem collections Modul verwenden. Es ist Teil der Standardbibliothek und betreibt das gleiche wie ein Wörterbuch mit der Ausnahme, dass, wenn ein neuer Schlüssel übergeben wird, wird es einen neuen Wert (eine Liste, in diesem Fall) erstellen automatisch

list1=['cat','animal'] 
list2=['dog','animal'] 
list3=['crow','bird'] 


from collections import defaultdict 

# create a new dictionary where an unknown key will automatically 
# add the key to the dictionary with a empty list as the value 
d = defaultdict(list) 

# iterate over your lists, updating the dictionary 
for value, key in (list1, list2, list3): 
    d[key].append(value) 

d 
# returns: 
defaultdict(list, {'animal': ['cat', 'dog'], 'bird': ['crow']}) 
1

Da Ihre Listen besteht aus Paaren, wobei das erste Element der Wert und das zweite der Schlüssel ist. Sie können ein mit Listen erstelltes defaultdict verwenden und dann die Ergebnisse einfach anhängen.

from collections import defaultdict 

dd = defaultdict(list) 
my_lists = [list1, list2, list3] 
for my_paired_list in my_lists: 
    v, k = my_paired_list 
    dd[k].append(v) 
>>> dict(dd) 
{'animal': ['cat', 'dog'], 'bird': ['crow']} 

Wenn Sie nicht mit nur einem Element Schlüssel wollen in einer Liste (zB 'bird': ['crow'] sollte 'bird': 'crow' sein), dann wandeln nur das Ergebnis:

new_result = {k: v[0] if len(v) == 1 else v for k, v in dd.iteritems()} 
>>> new_result 
{'animal': ['cat', 'dog'], 'bird': 'crow'} 
1

Wenn Sie Tupel von Listen haben oder Liste von Listen nach coed wird geeignet sein. Wenn Sie Variablen mit Listen definiert haben, können Sie einfach alle Listen zu einer Variablen hinzufügen und sie dann mit dem unten beschriebenen Algorithmus bearbeiten.

lists = ['cat','animal'],['dog','animal'],['crow','bird'] 
results = {} 

for list in lists: 
    if list[1] in results: 
     results[list[1]].append(list[0]) 
     print('bingo') 
    else: 
     results[list[1]] = [list[0]] 

print(results) 
1

Die anderen Antworten defaultdict mit nicht genau beabsichtigten Ausgabe entsprechen. Hier ist eine Version ohne defaultdict, die tut.

list1=['cat','animal'] 
list2=['dog','animal'] 
list3=['crow','bird'] 

dict1 = {} 
for v, k in (list1, list2, list3): 
    if k in dict1: 
     # If the value already exists (as string), convert it to list 
     # and append the new value 
     dict1[k] = [dict1[k]] 
     dict1[k].append(v) 
    else: 
     # Otherwise, we just want a string, not list 
     dict1[k] = v 

print(dict1) 
{'animal': ['cat', 'dog'], 'bird': 'crow'} 
1

Sie können lediglich eine verschachtelte Liste von Originaldaten durchlaufen und ein OrderedDict verwenden, um die Reihenfolge der Eingabe behalten:

from collections import OrderedDict 

data = [ 
    ['cat', 'animal'], 
    ['dog', 'animal'], 
    ['crow', 'bird'] 
] 

d = OrderedDict() 

for name, type in data: 
    if type in d: 
     d[type].append(name) 
    else: 
     d[type] = [name] 

Ausgang :

OrderedDict([('animal', ['cat', 'dog']), ('bird', ['crow'])]) 
Verwandte Themen