2016-06-05 5 views
0

Ich habe dies:Erstellen eines Wörterbuch, dessen Schlüssel geben Multiplizitäten der Werte in einem Array eines Arrays auftretende

array1 = [[1,2,3],[1,2,3],[2,1,3],[2,1,3],[1,-2,3]] 
array2 = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[0,2,3],[2,1,3]] 

und wollen diese erstellen:

multiArray1 = {[1,2,3]:2, [2,1,3]:2} 
multiArray2 = {[1,2,3]:4, [2,1,3]:1} 

Frage: Ich versuche mich zu Machen Sie multiArray1 und multiArray2 als Wörterbücher, die dieselben Werte enthalten, aber die Schlüssel geben an, wie oft diese Werte in array1 bzw. array2 auftreten.

Ich bin mir nicht sicher, was ich in meinem Code ändern soll. Jede Hilfe würde sehr geschätzt werden. Vielen Dank. diese

from collections import defaultdict 

array1 = [[1,2,3],[1,2,3],[2,1,3],[2,1,3],[1,-2,3]] 
array2 = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[0,2,3],[2,1,3]] 

def f(arrA,arrB): 
    multiArray1 = {} 
    multiArray2 = {} 

    intersect = set(map(tuple,arrA)).intersection(map(tuple,arrB)) 
    print(set(map(tuple,arrA)).intersection(map(tuple,arrB))) 

    for i in intersect: 
     multiArray1.update({i:0}) 
     multiArray2.update({i:0}) 
    print(multiArray1) 
    print(multiArray2) 

    multipleArray1 = {} 
    multipleArray2 = {} 

    for i in intersect: 
     for j in range(len(arrA)): 
      if str(tuple(arrA[j])) in set(intersect): 
       multiArray1[tuple(arrA[j])].append(j) 
       print(multiArray1) 

       multipleArray1 = defaultdict(list) 
       for key, value in multipleArray1: 
        multipleArray1[i].append(j) 
        print(multipleArray1) 

    for j in range(len(arrB)): 
     if str(tuple(arrB[j])) in set(intersect): 
      multiArray2[tuple(arrB[j])].append(j) 

      multipleArray2 = defaultdict(list) 
      for key, value in multipleArray2: 
       multipleArray2[i].append(j) 
       print(multipleArray2) 

    print(multiArray1) 
    print(multiArray2) 

f(array1,array2) 

Die Ausgabe, die Sie aus dem obigen Code zu erhalten ist:

{(2, 1, 3), (1, 2, 3)} 
{(2, 1, 3): 0, (1, 2, 3): 0} 
{(2, 1, 3): 0, (1, 2, 3): 0} 
{(2, 1, 3): 0, (1, 2, 3): 0} 
{(2, 1, 3): 0, (1, 2, 3): 0} 
+0

Sie können keine Listen als Wörterbuchschlüssel haben - sie sind veränderbar -> nicht hashbar. – miradulo

+0

Sie können 'list' nicht als Schlüssel für ein' dictionary' verwenden. –

+0

{[1,2,3]: 2, [2,1,3]: 2} - das ist kein gültiges Diktat und kein Array! –

Antwort

0

Der Trick ist, wandeln sie in eine Zeichenfolge, bevor Sie sie ein Schlüssel eines dict machen, weil Sie nicht Liste haben kann als Schlüssel für ein Wörterbuch.

dct1 = {} 
dct2 = {} 
array1 = [[1,2,3],[1,2,3],[2,1,3],[2,1,3],[1,-2,3]] 
array2 = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[0,2,3],[2,1,3]] 

for x in array1: 
    cnt = array1.count(x) 
    dct1[str(x)] = cnt #here str(x) convert the list to string 
for x in array2: 
    cnt = array2.count(x) 
    dct2[str(x)] = cnt #again here 


print (dct1) 
print (dct2) 

Ausgabe

>>> 
{'[1, 2, 3]': 2, '[1, -2, 3]': 1, '[2, 1, 3]': 2} 
{'[1, 2, 3]': 4, '[2, 1, 3]': 1, '[0, 2, 3]': 1} 
>>> 
+0

Dank GLHF. Ich werde deine Antwort akzeptieren. –

+0

Downvote für ??? – GLHF

+2

Downvoted, das scheint mir nur eine schlechte Lösung zu sein. Es ist kein "Trick", eine Liste in eine Zeichenfolge umzuwandeln, damit Sie sie als Wörterbuchschlüssel verwenden können. Was passiert, wenn die Liste geändert wird? Was ist mit Wörterbuchsuche? Eine bessere Antwort würde darauf eingehen, warum das Prinzip, eine Liste als Wörterbuchschlüssel zu haben, keinen Sinn ergibt. – miradulo

1

Als jemand erwähnt, können Sie keine Listen verwenden. In meinem Ansatz müssen Sie Ihre Unterlisten in Tupel konvertieren und dann ein Wörterbuch aktualisieren.

In [48]: array1 = [[1,2,3],[1,2,3],[2,1,3],[2,1,3],[1,-2,3]] 

In [49]: array1 = list(map(lambda x: tuple(x), array1)) 

In [50]: array1 
Out[50]: [(1, 2, 3), (1, 2, 3), (2, 1, 3), (2, 1, 3), (1, -2, 3)] 

In [51]: res = dict() 

In [52]: for i in array1: 
    if i not in res: 
     res[i] = 1 
    else: 
     res[i] += 1 
    ....:   

In [53]: res 
Out[53]: {(1, -2, 3): 1, (1, 2, 3): 2, (2, 1, 3): 2} 
Verwandte Themen