计数“;“唯一对”;将数字输入python字典?

计数“;“唯一对”;将数字输入python字典?,python,python-3.x,dictionary,itertools,nested-lists,Python,Python 3.x,Dictionary,Itertools,Nested Lists,编辑:编辑打字;字典的键值应该是字典,而不是集合 尽管如此,我仍将保留这些打字错误,因为下面的问题解决了这个问题。我对造成的混乱表示歉意 问题是: 假设我有一个整数列表,其中从不重复: list1 = [2, 3] 在这种情况下,存在唯一的对2-3和3-2,因此字典应为: {2:{3: 1}, 3:{2: 1}} 也就是说,有1对2-3和1对3-2 对于较大的列表,配对是相同的,例如 list2 = [2, 3, 4] 他有离婚史吗 {2:{3: 1}, 3:{2: 1}, 3:{4

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

尽管如此,我仍将保留这些打字错误,因为下面的问题解决了这个问题。我对造成的混乱表示歉意

问题是:

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

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

{2:{3: 1}, 3:{2: 1}}
也就是说,有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

中有一些有用的东西,您想要的是对列表中的组合产生的对进行计数。您可以找到带有
计数器和
组合的计数器

from itertools import combinations
from collections import Counter

list2 = [2, 3, 4]

count = Counter(combinations(list2, 2))

print(count)
输出 至于您的列表,我们使用每个子列表的结果更新
计数器

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)
输出
您需要的是对列表中的组合产生的对进行计数。您可以找到带有
计数器和
组合的计数器

from itertools import combinations
from collections import Counter

list2 = [2, 3, 4]

count = Counter(combinations(list2, 2))

print(count)
输出 至于您的列表,我们使用每个子列表的结果更新
计数器

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)
输出
我的方法迭代输入
dict
(线性复杂度)并将每个键与其第一个可用整数配对(此复杂度取决于问题的具体规格-例如,每个列表是否可以包含无限子列表?),然后将其插入输出dict(恒定复杂度)


我很确定有一种更精细的方法可以做到这一点(同样,这取决于你问题的具体规格),但这可以让你开始(无导入)

我的方法迭代输入
dict
(线性复杂度)并将每个键与其第一个可用整数配对(这种复杂性取决于问题的具体规格-例如,每个列表是否可以包含无限的子列表?),将这些子列表插入输出dict(恒定复杂性)


我很确定有一种更精细的方法可以做到这一点(同样,这取决于您问题的具体规格),但这可能会让您开始(无进口)

我认为您的预期输出错误,与您描述的不符。同意@OlivierMelançon;请澄清输入和预期输出。(您的输出还使用集合,集合是无序集合,
{3,1}
{1,3}
是等价的)另外,这也没有多大意义……你说一个数字不能重复,那么答案就是每对可能的数字都是两个。@OlivierMelançon对不起。请查看编辑。这些应该是字典值,而不是集合。@ReblochonMasque,对不起。请查看编辑。这些应该是字典值,而不是集合ries,而不是集合。我认为您的预期输出是错误的,它不符合您所描述的。同意@OlivierMelançon;请澄清输入和预期输出。(您的输出还使用集合,集合是无序集合,
{3,1}
{1,3}
是等效的)另外,这也没有多大意义……你说一个数字不能重复,那么答案就是每对可能的数字都是两个。@OlivierMelançon对不起。请查看编辑。这些应该是字典值,而不是集合。@ReblochonMasque,对不起。请查看编辑。这些应该是字典值,而不是集合ries,而不是sets。出色地使用了库函数。它几乎总是比一次性的特殊代码更可取,在编辑器中不容易调试。出色地使用了库函数。它几乎总是比一次性的特殊代码更可取,在编辑器中不容易调试。
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