需要针对每个键及其值执行一个功能,对照每个键及其值执行一个功能,并记录结果

时间:2019-02-11 17:50:37

标签: python dictionary

我正在编写一段代码,该代码需要对字典中的所有键/值执行函数循环样式。

为简化问题,我有一个字典:

my_dict = {a: [1,2,3,4,5], b: [5,4,3,2,1], c: [2,4,3,5,1], d: [5,1,4,2,3]}

我想调用一个函数,该函数将每个键值作为输入来输入其他键:

(该函数将输出一个整数。)

x1 = my_func(my_dict[a], my_dict[b])
x2 = my_func(my_dict[a], my_dict[c])
x3 = my_func(my_dict[a], my_dict[d])
x4 = my_func(my_dict[b], my_dict[c])
x5 = my_func(my_dict[b], my_dict[d])
x6 = my_func(my_dict[c], my_dict[d])

并保存结果:

result_dict = {a:{b:x1, c:x2, d:x3 }, b:{a:x1, c:x4, d:x5}, c:{a:x2, b:x4, d:x6}, d:{a:x3, b:x5, c:x6}}

我已经尝试了多个for循环,但是却转圈了:

my_dict = {1: [1,2,3,4,5], 2: [5,4,3,2,1], 3: [2,4,3,5,1], 4: [5,1,4,2,3]}

output_dict = {}
for key in my_dict:
    for next_key in my_dict:
        output_dict[key] = {next_key: my_func(my_dict[key],my_dict[next_key])}

print(output_dict)

谢谢您的时间。

4 个答案:

答案 0 :(得分:1)

您可以略微修改循环并将其转变为字典理解功能,以实现所需的方式:

my_dict = {1: [1,2,3,4,5], 2: [5,4,3,2,1], 3: [2,4,3,5,1], 4: [5,1,4,2,3]}

output_dict = {}
for key in my_dict:
    output_dict[key] = {next_key: my_func(my_dict[key], my_dict[next_key]) for next_key in my_dict if key != next_key}

print(output_dict)

毫不客气地取自另一个答案(:p),假设my_func是:

def my_func(x, y):
    return x[0] + y[0]

这将输出预期的结果:

{1: {2: 6, 3: 3, 4: 6}, 2: {1: 6, 3: 7, 4: 10}, 3: {1: 3, 2: 7, 4: 7}, 4: {1: 6, 2: 10, 3: 7}}

答案 1 :(得分:1)

使用itertools.combinationscollections.defaultdict

from collections import defaultdict
from itertools import combinations

out_dict = defaultdict(dict)
for x, y in combinations(my_dict.keys(), 2):
    result = my_func(my_dict[x], my_dict[y])
    out_dict[x][y] = result
    out_dict[y][x] = result

假设您有一个my_func,它将两个列表的第一个索引加在一起:

def my_func(x, y):
    return x[0] + y[0]

您的结果将是:

defaultdict(<class 'dict'>, {
    'a': {'b': 6, 'c': 3, 'd': 6},
    'b': {'a': 6, 'c': 7, 'd': 10},
    'c': {'a': 3, 'b': 7, 'd': 7},
    'd': {'a': 6, 'b': 10, 'c': 7}
})

答案 2 :(得分:0)

认为,您在问这样的事情:

my_dict = {'a': [1, 2, 3, 4, 5], 'b': [5, 4, 3, 2, 1], 'c': [2, 4, 3, 5, 1], 'd': [5, 1, 4, 2, 3]}
result_dict = {}


def my_func(list1, list2):
    return [list1, list2]


for key, values in my_dict.items():
    temp_dict = {}
    for second_key, second_value in my_dict.items():
        if key != second_key:
            temp_dict.update({
                second_key: my_func(my_dict[key], my_dict[second_key])
        })
    result_dict.update({key: temp_dict})

print(result_dict)

对我来说输出:{'b': {'a': [[5, 4, 3, 2, 1], [1, 2, 3, 4, 5]], 'd': [[5, 4, 3, 2, 1], [5, 1, 4, 2, 3]], 'c': [[5, 4, 3, 2, 1], [2, 4, 3, 5, 1]]}, 'a': ......(很长)。我认为您可能没有意识到dictionary.items()会返回字典的键和值。您可以循环浏览其中的两个,只要key != second_key就不会将键值对与其自身进行比较。然后,您可以使用dict.update({})将这些值存储在字典中。填满临时字典temp_dict之后,每个循环都会被重置,您可以将值保存在字典result_dict的字典中。我相信您可以更改函数my_func(),此代码将为您工作!

答案 3 :(得分:0)

您可以使用以下代码为每个值调用my_func,而无需重复先前的键。

old_keys = []
for key1 in my_dict.keys():
    old_keys.append(key1)
    for key2 in my_dict.keys():
        if key1 != key2 and key2 not in old_keys:
            output_dict[key1] = {key2: my_func(my_dict[key1],my_dict[key2])}
相关问题