Создание словаря, ключи которого дают кратности значений, встречающихся в массиве массива.

У меня есть это:

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}

Вопрос: я пытаюсь сделать 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}

2 ответа

Решение

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

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

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

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}
Другие вопросы по тегам