gpt4 book ai didi

python - 如何改进这个重度嵌套的 for 循环?

转载 作者:行者123 更新时间:2023-11-30 22:54:41 25 4
gpt4 key购买 nike

如果可能的话,我有一个想要优化的函数。但我无法轻易判断是否有更好的方法来重构(和优化)这个......

假设,

keys_in_order = ['A', 'B', 'C', 'D', 'E']
key_table = { 'A': {'A1': 'one', 'A2': 'two', 'A3': 'three', 'A4': 'four'},
'B': {'B1': 'one-one', 'B2': 'two-two', 'B3': 'three-three'},
... # mapping for 'C', 'D' here
'E': {'E1': 'one-one', 'E2': 'two-two', 'E3': 'three-three', 'E6': 'six-six'}
}

目的是将上述两个参数提供给函数,如下所示:

def generate_all_possible_key_combinations(keys_in_order, key_table):
first_key = keys_in_order[0]
second_key = keys_in_order[1]
third_key = keys_in_order[2]
fourth_key = keys_in_order[3]
fifth_key = keys_in_order[4]

table_out = [['Demo Group', first_key, second_key, third_key, fourth_key, fifth_key]] # just the header row so that we can write to a CSV file later

for k1, v1 in key_table[first_key].items():
for k2, v2 in key_table[second_key].items():
for k3, v3 in key_table[third_key].items():
for k4, v4 in key_table[fourth_key].items():
for k5, v5 in key_table[fifth_key].items():
demo_gp = k1 + k2 + k3 + k4 + k5
table_out.append([demo_gp, v1, v2, v3, v4, v5])

return table_out

这样的目标是拥有一个包含所有可能的子键组合(即“A1B1C1D1E1”、“A1B1C1D1E2”、“A1B1C1D1E3”等)及其在key_table<中的相应值的表.

对我来说,当前通过字典 key_table 进行五个重度嵌套循环的代码很丑陋,更不用说它在计算方面效率低下。有没有办法改善这一点?我希望来自 code_review 的人们能够对我如何解决这个问题提供一些启发。谢谢!

最佳答案

我已经用另一种方法实现了。考虑为key_table作为你的主要词典。

我的逻辑是

  1. 由此我将从主字典中获取所有可能的子键。

    In [1]: [i.keys() for i in key_table.values()]
    Out[1]:
    [['A1', 'A3', 'A2', 'A4'],
    ['C3', 'C2', 'C1'],
    ['B1', 'B2', 'B3'],
    ['E6', 'E1', 'E3', 'E2'],
    ['D2', 'D3', 'D1']]
  2. 然后我将这个列表列表作为一个列表。

    In [2]: print [item for sublist in [i.keys() for i in key_table.values()] for item in sublist]
    ['A1', 'A3', 'A2', 'A4', 'C3', 'C2', 'C1', 'B1', 'B2', 'B3', 'E6', 'E1', 'E3', 'E2', 'D2', 'D3', 'D1']
  3. 使用 itertools.combinations实现了所有可能值的组合。它有 5 个元素,所以我将其作为硬编码方法给出。您可以将其替换为 len([i.keys() for i in key_table.values()])如果你更有值(value)。这里提供了 itertools.combinations 的示例。那么你就可以理解了。

    In [83]: for i in itertools.combinations(['A1','B1','C1'],2):
    ....: print i
    ....:
    ('A1', 'B1')
    ('A1', 'C1')
    ('B1', 'C1')

这是一行实现的完整代码。

for item in itertools.combinations([item for sublist in [i.keys() for i in key_table.values()] for item in sublist],5):
print ''.join(item)

关于python - 如何改进这个重度嵌套的 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37683800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com