首页 > 解决方案 > 加速列表和for循环python

问题描述

我有一个关于如何加速以下代码的问题,我有两个单独的嵌套列表,它们相互比较:

List1 = [['apple', 'banana'], ['kiwi', 'orange'], ['apple','kiwi'], ['blueberry', 'banana'],['coconut','grape']]
List2 = [['kiwi', 'orange', 'coconut'], ['banana','apple','blueberry', 'coconut'], ['banana','orange','grape'],['apple','kiwi'],['blueberry']]

def smoothies(List1, List2):

    if "banana" in List1 and "coconut" in List2:
        result = 'Smoothie1'

    elif "kiwi" in List1 and 'banana' in List2:
        result = 'Smoothie2'

    elif 'apple' in List1 and 'grape' in List2:
        result = 'Smoothie3'

    elif 'blueberry' in List1 and 'apple' in List2:
        result = 'Smoothie4'

    elif 'grape' in List1 and 'blueberry' in List2:
        result = 'Smoothie5'

    else:
        result = 'None'

    return result

这个想法是比较两个列表的所有潜在组合,并将所有选项附加到一个新列表中。如果有人也可以解释为什么这样我可以更好地理解它,那就太好了!谢谢!

标签: pythonlistloopsdictionarycartesian-product

解决方案


这个想法是比较两个列表的所有潜在组合,并将所有选项附加到一个新列表中。

对于可变数量的变量,您可以使用字典。

要计算两个列表的成对笛卡尔积,您可以使用itertools.productwith map。然后使用字典推导来映射唯一组合:

from itertools import chain, product

products = set(chain.from_iterable(map(product, List1, List2)))

res = {smoothie: f'Smoothie{idx}' for idx, smoothie in enumerate(products, 1)}

结果:

{('apple', 'banana'): 'Smoothie7',
 ('apple', 'coconut'): 'Smoothie3',
 ('apple', 'grape'): 'Smoothie13',
 ('apple', 'kiwi'): 'Smoothie2',
 ('apple', 'orange'): 'Smoothie4',
 ('banana', 'apple'): 'Smoothie9',
 ('banana', 'coconut'): 'Smoothie8',
 ('banana', 'kiwi'): 'Smoothie11',
 ('banana', 'orange'): 'Smoothie17',
 ('blueberry', 'apple'): 'Smoothie16',
 ('blueberry', 'kiwi'): 'Smoothie15',
 ('coconut', 'blueberry'): 'Smoothie10',
 ('grape', 'blueberry'): 'Smoothie12',
 ('kiwi', 'apple'): 'Smoothie21',
 ('kiwi', 'banana'): 'Smoothie1',
 ('kiwi', 'blueberry'): 'Smoothie23',
 ('kiwi', 'coconut'): 'Smoothie22',
 ('kiwi', 'grape'): 'Smoothie20',
 ('kiwi', 'orange'): 'Smoothie19',
 ('orange', 'apple'): 'Smoothie6',
 ('orange', 'banana'): 'Smoothie18',
 ('orange', 'blueberry'): 'Smoothie14',
 ('orange', 'coconut'): 'Smoothie5'}

另一方面,如果您正在寻找跨子列表的所有组合,则可以展平输入列表并product直接使用。


推荐阅读