Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 几个列表理解-一个接一个_Python_For Loop_List Comprehension - Fatal编程技术网

Python 几个列表理解-一个接一个

Python 几个列表理解-一个接一个,python,for-loop,list-comprehension,Python,For Loop,List Comprehension,我已经编写了一些代码,为了尝试和掌握列表理解的概念,我正在尝试将一些代码转换为列表理解 我有一个嵌套的for循环: with (Input) as searchfile: for line in searchfile: if '*' in line: ID = line[2:13] IDstr = ID.strip() print IDstr hit = line

我已经编写了一些代码,为了尝试和掌握列表理解的概念,我正在尝试将一些代码转换为列表理解

我有一个嵌套的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
它似乎只起作用,如果它是第一个。为什么会这样

Hit = [line for line in Input if '*' in line]
print Hit

Positions = [(i, x) for i, x in enumerate(Hit) if x == '*']
print Positions
这是因为
file
对象--
input
在您的例子中--是迭代器,也就是说,一旦迭代一次,它们就会耗尽。在for循环中,这不是一个问题,因为您对
ID
position
只迭代了一次文件。如果要使用这样的两个列表理解,则必须为第二个列表重新打开文件,或者将文件中的行读入列表,并在列表理解中使用该列表

还要注意,您的
位置
列表理解是错误的,因为它枚举了
命中
列表,而不是列表中的每个元素,就像循环中的情况一样

您可以这样尝试(未经测试):

该嵌套列表理解大约相当于此嵌套循环:

positions = []
for line in star_lines:
    for i, x in enumerate(line):
        if x == '*':
            posiitons.append(i)

基本上,您只需“展平”代码块,然后将要追加的内容放在前面。

这很有道理,@tobias_k。你的答案已经过测试,而且有效!谢谢你。你能给我一个简短的解释一下上面的嵌套列表理解是如何工作的吗?