【问题标题】:Creating a dictionary whose keys give multiplicities of the values occurring in an array of an array创建一个字典,其键给出数组的数组中出现的值的多重性
【发布时间】:2016-10-05 04:33:04
【问题描述】:

我有这个:

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}

【问题讨论】:

  • 您不能将列表作为字典键 - 它们是可变的 -> 不可散列。
  • 我的意思是 array2 和 array2 是数组的数组。另外,我是一个开始使用python的用户。几年前我自学了一些基本的python,但这就是我对python的了解。
  • 尝试使用 collections.Counter 类,你必须确保,任何你想要存储和测量它的输入多重性的列表都被重新映射到一个元组,因为即使是 Counter 字典包装器也需要可散列的不可变条目作为键。如果您不清楚并且您无法找到,请详细询问如何使用我建议的 Counter 类执行此操作。我们在这里帮助他人。
  • 根据您的代码,不,它们不是。它们是列表。
  • 欢迎回到 Python @MeeSeongIm - 正如 DonkeyKong 所说,Python 中有数组。您在这里拥有的是列表(在方括号中),它们大多像数组一样工作,但是在学习时,注意措辞的细节差异通常是有益的,以尽量减少误解。请尝试我的收藏。上面的反建议和 tuple([1, 2, 3]) 从列表 [1, 2, 3] 中创建这样一个可散列的元组 (1, 2, 3) 沿强烈推荐和 HTH 的进一步问题

标签: python arrays python-3.x dictionary multiplicity


【解决方案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}

【讨论】:

    【解决方案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}
    >>> 
    

    【讨论】:

    • 投反对票,这对我来说似乎是一个糟糕的解决方案。将列表转换为字符串不是“技巧”,因此您可以将其用作字典键。如果列表被修改了怎么办?字典查找呢?一个更好的答案是解释为什么将列表作为字典键的原则没有意义。
    • 如果列表被修改了怎么办?然后密钥会改变。仔细阅读答案,因为我们正在重新创建密钥,而不是更改。
    • @GLHF 不,肯定不会。
    • @GLHF 顺便说一句,感谢您的连续投票,我很开心 :) 继续。
    • 我没有反对任何事情,请停止。
    猜你喜欢
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多