如何在列表理解中分配给函数调用

时间:2018-10-03 00:32:20

标签: python python-3.x list-comprehension

我正在尝试优化一些代码以处理列表列表,并且我注意到当我尝试在列表中指定列表时,会因语法或输出错误而不断出错。

我的代码在下面

out = []
for cluster in ClusterFile:
    cluster = list(cluster)
    for term in cluster[3]:
        for item in Interest:
            if term == item[0]:
                x = [item[1]]
                cluster.append(x)
                break
        out.append(cluster)
        break

我的许多尝试之一:

out = [([item[1]]) for item in Interest for term in cluster[3] if term ==item[0] for cluster in ClusterFile]

示例输入:

cluster = [['a'], [1, 2], [3, 4], [['w'], ['x'], ['y'], ['z']], [5, 6]]

Interest = [['w', 'qx12'], ['y', 'qx19']]

示例输出:

[['a'], [1, 2], [3, 4], [['w'], ['x'], ['y'], ['z']], [5, 6], ['qx12', 'qx19']]

有人知道有什么资源可以帮助我解决这个问题吗?我正在用Python 3进行编码

1 个答案:

答案 0 :(得分:3)

虽然我同意@blacksite的观点,列表理解并不是最容易理解的方法,但如果这是您的目标,请按以下步骤操作:

cluster.append(
    [x[0] for x in [[item[1] for item in Interest if term[0] == item[0]] 
                    for cluster in ClusterFile for term in cluster[2]] 
     if len(x)]
)

cluster
# [['a'], [1, 2], [['w'], ['x'], ['y'], ['z']], [5, 6], ['qx12', 'qx19']]

数据:

cluster = [['a'], [1, 2], [['w'], ['x'], ['y'], ['z']], [5, 6]]
ClusterFile = [cluster]
Interest = [['w', 'qx12'], ['y', 'qx19']]

一些注意事项:

  • 嵌套列表推导的工作顺序与嵌套循环的顺序相同。因此,如果您有:

    for a in b:
        for x in a:
            f(x)
    

    那么这看起来像:

    [f(x) for a in b for x in a]
    

    这似乎有些倒退,因为x in a离使用x的语句的前面很远。只需将其视为嵌套for循环的顺序即可。 (您在原始代码中向后了。)

  • 您想要cluster[2],而不是cluster[3]

  • cluster[2]中选择单个元素时,例如['w']['x']等,您正在将由['w']表示的 list 元素(term)与 string < / em>包含在该列表('w'中,由item[0]表示。那将不匹配,您需要term[0]来代替。
  • 最后附加的列表(x[0]的列表)会丢弃一些在内部列表理解中创建的空列表。那不是很漂亮,也许有更好的方法可以做到这一点。但是,我认为,如果没有列表理解,整个方法将更具可读性。