Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加速python的列表和循环_Python_List_Loops_Dictionary_Cartesian Product - Fatal编程技术网

加速python的列表和循环

加速python的列表和循环,python,list,loops,dictionary,cartesian-product,Python,List,Loops,Dictionary,Cartesian Product,我有一个关于如何加速以下代码的问题,其中我有两个单独的嵌套列表,它们相互比较: List1 = [['apple', 'banana'], ['kiwi', 'orange'], ['apple','kiwi'], ['blueberry', 'banana'],['coconut','grape']] List2 = [['kiwi', 'orange', 'coconut'], ['banana','apple','blueberry', 'coconut'], ['banana','ora

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

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
其思想是对所有潜在组合的两个列表进行比较,并将所有选项附加到新列表中。如果有人也能解释一下原因,这样我就能更好地理解它,那就太好了!谢谢大家!

这样做的目的是比较两个列表的所有潜在风险 组合和所有选项将附加到新列表中

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

要计算两个列表的成对笛卡尔积,可以使用
itertools.product
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'}

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

假设您想要水果子列表的所有组合的冰沙:

>>> from itertools import product
>>> [(l1, l2, smoothies(l1, l2)) for l1, l2 in product(List1, List2)]
[(['apple', 'banana'], ['kiwi', 'orange', 'coconut'], 'Smoothie1'),
 (['apple', 'banana'], ['banana', 'apple', 'blueberry', 'coconut'], 'Smoothie1'),
 ... many more ...
 (['coconut', 'grape'], ['apple', 'kiwi'], 'None'),
 (['coconut', 'grape'], ['blueberry'], 'Smoothie5')]

smoothies
功能与此有什么关系?而如何结合呢?结果列表应该是什么样子?在我看来,您当前的代码似乎相当于
def smoothis(List1,List2):返回None
,因为您有嵌套的列表。你确定你在这里显示了正确的函数吗?你是在寻找类似于产品(列表1,列表2)中l1,l2的平滑(l1,l2)的东西吗?
?谢谢你的评论-我在python方面还不太先进,也没有遇到过这样的问题:f'Smoothie{idx}“-这是引用字典索引的一种方式吗?这只是在Python 3.6+中生成字符串的一种方式,相当于
'Smoothie'+str(idx)
,但正如您所看到的,更干净(更有效)。@jpp我想说
f'Smoothie{idx}
相当于
'Smoothie{}'。格式(idx)
。说它等同于
'Smoothie'+str(idx)
有点误导,因为格式化不是基于字符串连接的(Python新手经常误用字符串连接)。@EliKorvigo,说得对。我试图证明这种效果。可能
str.format
现在需要向OP解释。