我正在尝试优化一些代码以处理列表列表,并且我注意到当我尝试在列表中指定列表时,会因语法或输出错误而不断出错。
我的代码在下面
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进行编码
答案 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]
的列表)会丢弃一些在内部列表理解中创建的空列表。那不是很漂亮,也许有更好的方法可以做到这一点。但是,我认为,如果没有列表理解,整个方法将更具可读性。