词典理解考试

2024-10-02 10:30:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个集合,它包含n组素数(3):

>>> sets
{frozenset({3, 13, 23}), frozenset({17, 2, 13}), 
frozenset({19, 2, 3}), frozenset({3, 29, 23}), frozenset({17, 11, 23}),
frozenset({17, 2, 19}), frozenset({11, 17, 3}), frozenset({17, 5, 7})}

我想创建一个包含值的字典:素数和三个键:三个素数的乘积。你知道吗

这是我的尝试:

lists = [list(i) for i in sets]
products = [reduce(lambda x,y:x*y,i) for i in lists]
dictir = {x:y for x in products for y in sets}

但dictir给了我不正确的结果:

{897: frozenset({17, 5, 7}), 114: frozenset({17, 5, 7}), 595: frozenset({17, 5, 7}), 561: frozenset({17, 5, 7}), 646: frozenset({17, 5, 7}), 2001: frozenset({17, 5, 7}), 442: frozenset({17, 5, 7}), 4301: frozenset({17, 5, 7})}

你能帮我纠正一下吗?你知道吗


Tags: lambdainreducefor字典setslists素数
3条回答

您可以使用zip(),但另一种更有效的方法是:

import operator
tuples = ((reduce(operator.mul, i), i) for i in sets)
dictir = dict(tuples)

# Or as a 1 liner
dictir = {reduce(operator.mul, i): i for i in sets}

进行双重迭代并有效地创建listsproducts的笛卡尔积。你知道吗

要对多个序列进行元素级迭代,只需使用^{}。你知道吗

dictir = {x: y for x, y in zip(products, sets)} 

当然,您可以删除所有中间变量并执行简单的一行:

sets = {frozenset({3, 13, 23}), frozenset({17, 2, 13}),
        frozenset({19, 2, 3}), frozenset({3, 29, 23}), frozenset({17, 11, 23}),
        frozenset({17, 2, 19}), frozenset({11, 17, 3}), frozenset({17, 5, 7})}
dictir = {reduce(lambda x, y: x * y, s): s for s in sets}

我认为,你可以简单地使用:

import operator
dictir = {reduce(operator.mul,numbers):numbers for value in sets}

相关问题 更多 >

    热门问题