扩展列表理解(更好地理解它)?

时间:2017-10-12 01:56:55

标签: python list dictionary list-comprehension

我正在查看一些代码并尝试弄清楚如何解析列表理解以更好地理解它。
运行它的代码的完整长度等等,但我想我可以尝试展示我是如何“分解”成更多代码行来更好地理解它。

示例1:

for currentIter in trainEx:
    temp = {key: weights[key] + 0.05 * currentF[key]*currentT[1] if key in weights else 0.05*currentF[key]*currentT[1] for key in currentF.keys()}

同样,我并不完全确定如何“分解”临时等于所有的点点滴滴 我尝试过这个,但我知道这是不正确的:

for currentIter in trainEx:
    if key in weights:
        temp = {key: weights[key] + 0.05 * currentF[key]*currentT[1]}
    else:
        for key in currentF.keys():
        temp = {key: 0.05*currentF[key]*currentT[1]}

示例2:

pi = {weights.keys()[i] : random.randint(1, 100) for i in range(len(weights.keys())) if random.randint(0,1) == 1}

同样,我在打破这个问题时遇到了一些麻烦,可能是因为设置了符号。

不幸的是,所有这些例子都是我想要理解的很长一段代码的一部分 如果有帮助,我可以提供它(但它是非常长/多个文件) 但是,我认为大多数情况只是试图将列表理解分解为多行代码,只是为了更好地了解它在做什么。
任何帮助将不胜感激,看看我哪里出错了。

编辑:我删除了我解决的示例,并将其他示例保留了下来。

1 个答案:

答案 0 :(得分:1)

首先,尝试运行一些示例代码,看看是否得到相同的结果。

有一点需要注意,每次执行外循环时,都会覆盖列表/词典。根据代码的其余部分,这可能不是意图。

对于更复杂的一个,从这样的东西开始

temp = dict()
for currentIter in trainEx:
    for key in currentF.keys():
        temp[key] = (weights[key] + 0.05 * currentF[key]*currentT[1]) if (key in weights) else (0.05*currentF[key]*currentT[1])

然后提取条件

temp = dict()
for currentIter in trainEx:
    for key in currentF.keys():
        if key in weights:
            temp[key] = weights[key] + 0.05 * currentF[key]*currentT[1]
        else:
            temp[key]  = 0.05*currentF[key]*currentT[1]

对于最后一个,它类似,但你不需要range()

pi = dict()
for k in weights.keys():
    if random.randint(0,1) == 1:
        pi[k] = random.randint(1, 100)