繁体   English   中英

将数字的“唯一对”计数到python字典中?

[英]Counting “unique pairs” of numbers into a python dictionary?

编辑:编辑错别字; 字典的键值应该是字典,而不是集合。

我将在这里保留输入错误,因为以下问题解决了这个问题。 对于造成混乱,我深表歉意。

这是问题所在:

假设我有一个整数列表,其中永不重复:

list1 = [2, 3]   

在这种情况下,存在唯一的一对2-3和3-2,因此字典应为:

{2:{3: 1}, 3:{2: 1}}

即,存在一对2-3和1对3-2。

对于较大的列表,配对是相同的,例如

list2 = [2, 3, 4]

具有二分法

{2:{3: 1}, 3:{2: 1}, 3:{4: 1}, 4:{3: 1}, 2:{4: 1}, 4:{2: 1}}

(1)一旦列表的大小变得更大,一个人如何使用python数据结构在算法上找到这种格式的“唯一对”?

(2)我提到列表不能有重复整数,例如

[2, 2, 3]

这是不可能的,因为有两个2。

但是,可能会有一个列表列表:

list3 = [[2, 3], [2, 3, 4]] 

字典必须是

{2:{3: 2}, 3:{2: 2}, 3:{4: 1}, 4:{3: 1}, 2:{4: 1}, 4:{2: 1}}

因为有两对2-3和3-2。 给定一个列表中的多个列表,如何“更新”字典?

这是一个算法问题,我不知道最有效的解决方案。 我的想法是以某种方式将值缓存在列表中并枚举对……但这太慢了。 我猜itertools有一些有用的东西。

您想要的是对列表中组合产生的对进行计数。 您可以找到带有Countercombinations

from itertools import combinations
from collections import Counter

list2 = [2, 3, 4]

count = Counter(combinations(list2, 2))

print(count)

输出量

Counter({(2, 3): 1, (2, 4): 1, (3, 4): 1})

至于您的清单清单,我们会使用每个子清单的结果来更新Counter

from itertools import combinations
from collections import Counter

list3 = [[2, 3], [2, 3, 4]]

count = Counter()

for sublist in list3:
    count.update(Counter(combinations(sublist, 2)))

print(count)

输出量

Counter({(2, 3): 2, (2, 4): 1, (3, 4): 1})

我的方法遍历输入dict (线性复杂度),并将每个键与它的第一个可用整数配对(此复杂度取决于您问题的确切规格-例如,每个列表是否可以包含无限的子列表?),然后将它们插入到输出中dict(恒定复杂度)。

import os 
import sys 


def update_results(result_map, tup):
    # Update dict inplace
    # Don't need to keep count here
    try:
        result_map[tup] += 1
    except KeyError:
        result_map[tup] = 1
    return


def algo(input):
    # Use dict to keep count of unique pairs while iterating
    # over each (key, v[i]) pair where v[i] is an integer in 
    # list input[key]
    result_map = dict()
    for key, val in input.items():
        key_pairs = list()
        if isinstance(val, list):
            for x in val:
                if isinstance(x, list):
                    for y in x:
                        update_results(result_map, (key, y))
                else:
                    update_results(result_map, (key, x))
        else:
            update_results(result_map, (key, val))
    return len(result_map.keys())


>>> input = { 1: [1, 2], 2: [1, 2, [2, 3]] }
>>> algo(input)
>>> 5

我敢肯定,还有一种更精致的方法可以做到这一点(再次,这取决于您所问问题的具体规格),但这可以使您入门(无需导入)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM