2016-06-05 13 views
0

у меня есть это:Создание словаря, ключи дают кратностей значений, происходящих в массиве массива

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]] 

и хотите создать это:

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

Вопрос: Я пытаюсь make multiArray1 и multiArray2 как словари, содержащие одни и те же значения, но ключи дают количество раз, когда эти значения встречаются в array1 и array2 соответственно.

Я не уверен, что изменить в моем коде. Любая помощь будет принята с благодарностью. Благодарю.

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) 

Выход вы получите из приведенного выше кода заключается в следующем:

{(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

У вас нет списков в качестве словарных ключей - они изменяемы -> не хешируются. – miradulo

+0

У вас не может быть 'list' в качестве ключа для словаря. –

+0

{[1,2,3]: 2, [2,1,3]: 2} - это не действительный dict и не угрюмый массив! –

ответ

0

Хитрость заключается в том, преобразовать их в строку, прежде чем сделать их ключом в Словаре, потому что вы не можете иметь список как ключ для словаря.

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) 

Выход

>>> 
{'[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

Спасибо GLHF. Я приму свой ответ. –

+0

Downvote для ??? – GLHF

+2

Downvoted, это просто кажется плохим плохим решением для меня. Это не «трюк», чтобы преобразовать список в строку, чтобы вы могли использовать его в качестве словарного ключа. Что делать, если список изменен? Как насчет поиска в словаре? Лучшим ответом будет вопрос, почему принцип наличия списка в качестве словарного ключа не имеет смысла. – miradulo

1

Как кто-то отметил, что вы не можете использовать списки. В моем подходе вам нужно преобразовать подсписчики в кортежи, а затем обновить словарь.

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}