如何在列表推导中分配函数调用

Glo*_*oom 5 python list-comprehension python-3.x

我正在尝试优化一些代码来处理列表列表,我注意到当我尝试在列表中指定一个列表时,我会一直遇到语法或输出错误.

我的代码如下

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
Run Code Online (Sandbox Code Playgroud)

我的许多尝试之一:

out = [([item[1]]) for item in Interest for term in cluster[3] if term ==item[0] for cluster in ClusterFile]
Run Code Online (Sandbox Code Playgroud)

输入示例:

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

Interest = [['w', 'qx12'], ['y', 'qx19']]
Run Code Online (Sandbox Code Playgroud)

示例输出:

[['a'], [1, 2], [3, 4], [['w'], ['x'], ['y'], ['z']], [5, 6], ['qx12', 'qx19']]
Run Code Online (Sandbox Code Playgroud)

有谁知道任何可以帮助我解决这个问题的资源?我在Python 3中编码

and*_*ece 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']]
Run Code Online (Sandbox Code Playgroud)

数据:

cluster = [['a'], [1, 2], [['w'], ['x'], ['y'], ['z']], [5, 6]]
ClusterFile = [cluster]
Interest = [['w', 'qx12'], ['y', 'qx19']]
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • 嵌套列表推导式的工作顺序与嵌套 for 循环相同。所以如果你有:

    for a in b:
        for x in a:
            f(x)
    
    Run Code Online (Sandbox Code Playgroud)

    那么这看起来像:

    [f(x) for a in b for x in a]
    
    Run Code Online (Sandbox Code Playgroud)

    这看起来有点倒退,因为离使用x in a语句的前面很远。x只需将其想象为嵌套 for 循环的顺序即可。(你在原始代码中把它倒过来了。)

  • 你想要cluster[2],没有cluster[3]

  • cluster[2]当选择等中的单个元素时,您将用表示的列表元素 ( ) 与该列表 ( ) 中包含的['w']由表示的字符串进行比较。那不匹配,你需要代替。 ['x']['w']term'w'item[0]term[0]
  • 附加的最终列表(s 列表x[0])会删除一些在内部列表理解中创建的空列表。这不是很漂亮,可能有更好的方法来做到这一点。但同样,在我看来,如果没有列表理解,整个方法会更具可读性。