不理解在python中将循环转换为列表的代码

不理解在python中将循环转换为列表的代码,python,Python,我是python新手,并获得以下代码: nlist = autoscaling_connection.get_all_launch_configurations() name = "CONFIG" versions = [x.name[len(name):] for x in nlist if (x.name.startswith(name) and is_number(x.name[len(name):]))] 我知道for循环被连接到版本列表中,但我

我是python新手,并获得以下代码:

nlist = autoscaling_connection.get_all_launch_configurations()
name = "CONFIG"    
versions = [x.name[len(name):] for x in nlist
                if (x.name.startswith(name) and is_number(x.name[len(name):]))]
我知道for循环被连接到版本列表中,但我不理解分配:

[x.name[len(name):]

我将展开整个代码,然后进行检查

versions = [x.name[len(name):] for x in nlist
            if (x.name.startswith(name) and is_number(x.name[len(name):]))]
相当于

versions = []
for x in nlist:
    if (x.name.startswith(name) and is_number(x.name[len(name):])):
         versions.append(x.name[len(name):])
至于什么

x.name[len(name):]
表示从x.name开始,从索引等于
len(name)
(name的长度)到
x.name

在一个简单的例子中,假设我有一个列表

my_list = [1, 2, 3, 4, 5]
我也是

my_list[2:]
然后这会回来

[3, 4, 5]
这与从第2个元素到结尾的顺序相同


我希望这有帮助。如果您想进一步了解python切片表示法,我可以推荐另一个SO问题:

在python中,如果
x
是一个列表,
I
是一个索引(整数)

表示“从索引
i
开始到结尾的
x
中的所有项目”

你也可以

x[i:j]
x
中的所有项目从索引
i
一直到,但不包括
j

x
中的所有项目从开头一直到,但不包括
j

“复制新列表中x的所有元素并将其分配给y”

“x的每三个元素,从索引2开始,在索引9之前结束。”

我建议您在Python中查找更多列表属性。

稍微完整(但经过猜测)的代码:

输出:

['2', '4', '2711999']
为什么?

列表理解测试
nlist
的每个元素

它只允许将内容放入通过
if(x.name.startswith(name)和is_number(x.name[len(name):])统计的
版本中

含义:每个类实例
name
必须以变量
name
的内容开头,并且
name
获得的字符数之后的任何字符都必须检查为
True
,如果输入到
is_number()

如果符合,它将使用“数字部分”并将其作为元素添加到结果列表中

"Fiat Dupe 09"  # not in the list, because "Dupe 09" is not True
"DosntFly 0815" # not in the list, because not starting with "Fiat "

什么是
name
?它是从外部定义的。那么
nlist
呢?@madpysicast这在这里并不重要,因为他只是询问列表理解的语法。(尽管如果他试图提供MVCE的话会这样):)当然。我鼓励他问更清楚的问题,但不是坚持。可能的重复添加了nlist和name2th的定义?尼斯:)+我就是为了这个。除了索引2是第三个元素之外。你应该把它修好。
y = x[:]
y = x[2:9:3]
class K:
    """A class that has a name property"""
    def __init__(self,name):
        self.name = name

# a prefix to look for            
name = "Fiat "


# a list of objects that have a name - some starting with our name
nlist = [K("Fiat 2"), K("Fiat 4"), K("Fiat 2711999"), K("Fiat Dupe 09"), K("DosntFly 0815")]

def is_number(text):
    """Test if the text is an integer."""
    try:
        int(text.strip())
    except:
        return False
    return True


versions = [x.name[len(name):] for x in nlist
                if (x.name.startswith(name) and is_number(x.name[len(name):]))]

print(versions)
['2', '4', '2711999']
"Fiat Dupe 09"  # not in the list, because "Dupe 09" is not True
"DosntFly 0815" # not in the list, because not starting with "Fiat "