首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python字典中计算“唯一对”的数字吗?

在python字典中计算“唯一对”的数字吗?
EN

Stack Overflow用户
提问于 2018-09-06 10:59:21
回答 2查看 4.2K关注 0票数 0

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

我将在这里保留打字错误,因为下面的问题解决了这个问题。我为造成的混乱表示歉意。

以下是问题所在:

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

代码语言:javascript
复制
list1 = [2, 3]   

在这种情况下,有一个唯一的对2-3和3-2,所以字典应该是:

代码语言:javascript
复制
{2:{3: 1}, 3:{2: 1}}

也就是说,有一对2-3和一对3-2。

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

代码语言:javascript
复制
list2 = [2, 3, 4]

有二元论吗?

代码语言:javascript
复制
{2:{3: 1}, 3:{2: 1}, 3:{4: 1}, 4:{3: 1}, 2:{4: 1}, 4:{2: 1}}

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

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

代码语言:javascript
复制
[2, 2, 3]

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

但是,可以有一个列表列表:

代码语言:javascript
复制
list3 = [[2, 3], [2, 3, 4]] 

因此,字典必须是

代码语言:javascript
复制
{2:{3: 2}, 3:{2: 2}, 3:{4: 1}, 4:{3: 1}, 2:{4: 1}, 4:{2: 1}}

因为有两对2-3和3-2。如果一个列表中有多个列表,那么如何“更新”字典呢?

这是一个算法问题,我不知道最有效的解决方案。我的想法是以某种方式将值缓存在列表中,并枚举非常慢的pairs...but。我猜itertools里一定有什么有用的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-06 11:55:23

您想要的是计算从列表中的组合中产生的对。你可以找到那些有Countercombinations的。

代码语言:javascript
复制
from itertools import combinations
from collections import Counter

list2 = [2, 3, 4]

count = Counter(combinations(list2, 2))

print(count)

输出

代码语言:javascript
复制
Counter({(2, 3): 1, (2, 4): 1, (3, 4): 1})

至于您的列表列表,我们将使用每个子列表的结果来更新Counter

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
Counter({(2, 3): 2, (2, 4): 1, (3, 4): 1})
票数 4
EN

Stack Overflow用户

发布于 2018-09-06 12:36:57

我的方法迭代输入dict (线性复杂度),并将每个键与其第一个可用整数配对(此复杂度取决于问题的确切规格-例如,每个列表是否包含无限的子列表?),将它们插入到输出字典中(复杂度不变)。

代码语言:javascript
复制
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

我很确定有一种更好的方法来做这件事(同样,这取决于你问题的确切规格),但这可以让你开始(不导入)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52195887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档