我正在编写一段代码,该代码需要对字典中的所有键/值执行函数循环样式。
为简化问题,我有一个字典:
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)
谢谢您的时间。
答案 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.combinations
和collections.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])}