几个列表理解 - 一个接一个
Several list comprehensions - one after each other
我写了一些代码,为了尝试掌握列表推导的概念,我尝试将一些代码转换为列表推导。
我有一个嵌套的 for 循环:
with (Input) as searchfile:
for line in searchfile:
if '*' in line:
ID = line[2:13]
IDstr = ID.strip()
print IDstr
hit = line
for i, x in enumerate(hit):
if x=='*':
position.append(i)
print position
我已经将代码的第一部分变成了列表推导式:
ID = [line[2:13].strip() for line in Input if '*' in line]
print ID
这很好用。我试图做一些下一步,但它没有按预期工作。我如何相互进行多个列表理解。下面的 "Hit = …" 部分工作正常,如果它是第一个列表理解,但如果它是第二个则不行。与上述相同 - 它似乎只有在第一个时才有效。这是为什么?
Hit = [line for line in Input if '*' in line]
print Hit
Positions = [(i, x) for i, x in enumerate(Hit) if x == '*']
print Positions
it seems to work only, if it is the first. Why is this?
这是因为 file
个对象——在你的例子中是 input
——是迭代器,也就是说,一旦你迭代它们一次,它们就用完了。在您的 for 循环中,这不是问题,因为您只是为 ID
和 position
迭代文件一次。如果你想像这样使用两个列表理解,你要么必须为第二个重新打开文件,要么将文件中的行读入列表,然后在列表理解中使用该列表。
另请注意,您的 positions
列表理解是错误的,因为它枚举了 Hit
列表,而不是 in 列表中的每个元素,就像你的循环中的情况一样。
您可以这样尝试(未测试):
# first, get the lines with '*' just once, cached as a list
star_lines = [line for line in input if '*' in line]
# now get the IDs using those cached lines
ids = [line[2:13].strip() for line in star_lines]
# for the positions we need a nested list comprehension
positions = [i for line in star_lines for i, x in enumerate(line) if x == '*']
那个嵌套列表理解大约等同于这个嵌套循环:
positions = []
for line in star_lines:
for i, x in enumerate(line):
if x == '*':
posiitons.append(i)
基本上,您只需 "flatten" 那个代码块,然后将要附加的内容放在前面。
我写了一些代码,为了尝试掌握列表推导的概念,我尝试将一些代码转换为列表推导。
我有一个嵌套的 for 循环:
with (Input) as searchfile:
for line in searchfile:
if '*' in line:
ID = line[2:13]
IDstr = ID.strip()
print IDstr
hit = line
for i, x in enumerate(hit):
if x=='*':
position.append(i)
print position
我已经将代码的第一部分变成了列表推导式:
ID = [line[2:13].strip() for line in Input if '*' in line]
print ID
这很好用。我试图做一些下一步,但它没有按预期工作。我如何相互进行多个列表理解。下面的 "Hit = …" 部分工作正常,如果它是第一个列表理解,但如果它是第二个则不行。与上述相同 - 它似乎只有在第一个时才有效。这是为什么?
Hit = [line for line in Input if '*' in line]
print Hit
Positions = [(i, x) for i, x in enumerate(Hit) if x == '*']
print Positions
it seems to work only, if it is the first. Why is this?
这是因为 file
个对象——在你的例子中是 input
——是迭代器,也就是说,一旦你迭代它们一次,它们就用完了。在您的 for 循环中,这不是问题,因为您只是为 ID
和 position
迭代文件一次。如果你想像这样使用两个列表理解,你要么必须为第二个重新打开文件,要么将文件中的行读入列表,然后在列表理解中使用该列表。
另请注意,您的 positions
列表理解是错误的,因为它枚举了 Hit
列表,而不是 in 列表中的每个元素,就像你的循环中的情况一样。
您可以这样尝试(未测试):
# first, get the lines with '*' just once, cached as a list
star_lines = [line for line in input if '*' in line]
# now get the IDs using those cached lines
ids = [line[2:13].strip() for line in star_lines]
# for the positions we need a nested list comprehension
positions = [i for line in star_lines for i, x in enumerate(line) if x == '*']
那个嵌套列表理解大约等同于这个嵌套循环:
positions = []
for line in star_lines:
for i, x in enumerate(line):
if x == '*':
posiitons.append(i)
基本上,您只需 "flatten" 那个代码块,然后将要附加的内容放在前面。