【发布时间】:2020-12-23 13:30:31
【问题描述】:
我正在尝试从带有 if 语句的嵌套 for 循环创建列表推导,但我无法弄清楚。我在互联网上扫描了几个小时,但找不到解决方案。
循环看起来像这样:
lengths = []
data_frame = p.read_excel(fasta_path_[:-2] + 'xlsx', engine='openpyxl')
seqids = data_frame['qseqid'].tolist()
identical_ids = None
with open(fasta_path_, 'r') as fasta_file:
for line in fasta_file.readlines():
if identical_ids is True:
lengths.append(len(line.strip()))
for seq_id in seqids:
if seq_id in line:
identical_ids = True
continue
else:
identical_ids = False
continue
我的最后一次尝试:
lengths = [len(line.strip()) for line in fasta_file.readlines() if identical_ids for seq_id in seqids if seq_id in line identical_ids := True else identical_ids := False]
编辑
多次运行和修复代码后,看起来最终结果无法写成列表推导:
seqids = p.read_csv(csv_path, usecols=['qseqid'])
seqids = seqids['qseqid'].tolist()
queries_lengths = []
count = 0
id_in_tag_line = None
with open(fasta_path_, 'r') as fasta_file:
for line in fasta_file.readlines():
if count < len(seqids) and seqids[count] in line:
id_in_tag_line = True
count += 1
continue
if id_in_tag_line:
queries_lengths.append(len(line))
id_in_tag_line = None
由于这段代码中使用的两个列表非常大,for 循环运行了大约 30,000 个,所以我没有使用嵌套的 for 循环,而是使用了一个计数器。
如果有人认为有办法(或需要)将其编写为列表理解,我很乐意听到新的想法。
【问题讨论】:
-
列表理解是关于创建一个包含一些值的列表;您的第二个循环与在列表中包含值无关。
-
你为什么要这样做?该列表理解使代码更易于阅读还是更难阅读?
-
也许你可以使用
walrus操作符来做到这一点,但对我来说,第一个解决方案更具可读性。
标签: python if-statement list-comprehension nested-loops