Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.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 如何使用itertools将返回值从一个函数传递到另一个函数?_Python_Itertools - Fatal编程技术网

Python 如何使用itertools将返回值从一个函数传递到另一个函数?

Python 如何使用itertools将返回值从一个函数传递到另一个函数?,python,itertools,Python,Itertools,我有一份名单正在被退回 [('10.12.250.29', 'pdx02-he-trial-ansible01', 'us-west-2a', 'vol-e7775a10'), ('10.12.32.22', 'pdx02-cloud-prod-ansible01 Clone ', 'us-west-2b', 'vol-b0607d70'), ('10.12.0.20', 'pdx02-cloud-trial/dev-ansible01', 'us-west-2a', 'vol-b32e5c46

我有一份名单正在被退回

[('10.12.250.29', 'pdx02-he-trial-ansible01', 'us-west-2a', 'vol-e7775a10'), ('10.12.32.22', 'pdx02-cloud-prod-ansible01 Clone ', 'us-west-2b', 'vol-b0607d70'), ('10.12.0.20', 'pdx02-cloud-trial/dev-ansible01', 'us-west-2a', 'vol-b32e5c46'), ('10.12.250.7', 'pdx02-he-prod-ansible01', 'us-west-2a', 'vol-fd94400b'), ('10.12.250.4', 'pdx02-he-dev-ansible01', 'us-west-2a', 'vol-ee6abf18'), ('10.12.32.16', 'pdx02-cloud-prod-ansible', 'us-west-2b', 'vol-ae49adbb'), ('10.121.15.22', 'ansible-classic', 'us-west-2a', 'vol-f893c20d'), ('10.17.15.145', 'pdx01-ms-dev-ansible', 'us-west-2a', 'vol-e2d45515'), ('10.21.32.27', 'fra01-cloud-prod-ansible', 'eu-central-1b', 'vol-5f86f5bd'), ('10.21.250.13', 'fra01-he-trial-ansible01', 'eu-central-1a', 'vol-f9e7d220'), ('10.21.250.27', 'fra01-he-dev-ansible01', 'eu-central-1a', 'vol-f6e3fa2f'), ('10.21.0.9', 'fra01-cloud-dev-ansible01', 'eu-central-1a', 'vol-98104671'), ('10.21.250.5', 'fra01-he-prod-ansible01', 'eu-central-1a', 'vol-809b8259'), ('10.31.250.26', 'sin01-he-dev-ansible01', 'ap-southeast-1a', 'vol-86443940'), ('10.31.250.19', 'sin01-he-prod-ansible01', 'ap-southeast-1a', 'vol-bebcc178'), ('10.31.32.12', 'sin01-cloud-prod-ansible01', 'ap-southeast-1b', 'vol-01409de9'), ('10.31.250.27', 'sin01-he-trial-ansible01', 'ap-southeast-1a', 'vol-f6cdc631'), ('10.31.0.18', 'sin01-cloud-dev-ansible01', 'ap-southeast-1a', 'vol-3c0aac28')]
这基本上是:

<IP_ADDRESS> , <AWS_TAG_NAME> , <REGION> , <VOLUME>
这将打破上述列表,只选择所有内容的第一个字母,即ip_地址打印:

1,p,u,v,1,p,u,v,1,p,u,v,1,p,u,v,1,p,u,v,1,p,u,v,1,a,u,v,1,p,u,v,1,f,e,v,1,f,e,v,1,f,e,v,1,f,e,v,1,f,e,v,1,s,a,v,1,s,a,v,1,s,a,v,1,s,a,v,1,s,a,v
而不是10.12.250.29、10.12.32.22。。。。。。。。。。。。。。。。。。 其他人也一样

如何使用迭代器正确地打破这一点

我试图通过将以下值传递给快照创建者来创建快照:

def call_snapshot_creater(passed_data):
    ip_address = ','.join(list(itertools.chain(*[[j[0] for j in i] for i in data])))
    tags_descrip = list(itertools.chain(*[[j[1] for j in i] for i in data]))
    regions_az = list(itertools.chain(*[[j[2] for j in i] for i in data]))
    volume_id = list(itertools.chain(*[[j[3] for j in i] for i in data]))

    regions = ['us-west-2', 'eu-central-1', 'ap-southeast-1']

    for region in regions:
        ec2 = boto3.resource('ec2', region, aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, )
        print "Snapshot Creation For Ansible -> ",ip_address," initiated , tag = ", tags_descrip ,"region : ", regions_az
        print "Snapshot will be created with -> Name : ",tags_descrip
        snapshot = ec2.create_snapshot(VolumeId=volume_id, Description=tags_descrip)
        print snapshot.id
        print "Snapshot is being created for Ansible box ", tags_descrip ,"with snapshot id :",snapshot.id
        #slack.chat.post_message(slack_channel,"Creating Snapshot for The volume"+ str(snapshot.id),username='Ansible_box_snapshot_bot')
        snapshot.load()
        while snapshot.state != 'completed':
            print "The Snapshot :", snapshot.id , "for Ansible box named : ", tags_descrip  ,"is currently in :",snapshot.state," state"
            time.sleep(30)
            snapshot.load()
            print snapshot.progress
        else:
            print "Snapshot ",snapshot.id, "for Ansible box ", tags_descrip , "is now Ready!! Final state ->",snapshot.state

您没有正确使用
和解包。您所要做的一切,都可以通过
zip
和解包来完成<代码>邮政编码(*…):


您没有正确使用
和解包。您所要做的一切,都可以通过
zip
和解包来完成<代码>邮政编码(*…):


使用
[[j[0]表示j in i]表示i in data]
您将浏览列表,并计算
[j[0]表示j in i]
,其中
i
是当前元组。因此,您遍历元组,
j
是当前字符串,您得到该字符串的第一个字符

然而,您想要的只是元组的第一项。这意味着您甚至不需要
itertools.chain
:使用
[i[0]for i in data]
进行操作。这将获取每个元组的第一个元素,并生成预期的输出

下面是更改后的代码:

ip_address=','.join(i[0]表示数据中的i)#您可以在此处使用迭代器
标记_descripp=',join(i[1]表示数据中的i)
区域_az=','。连接(i[2]表示数据中的i)
卷_id=','。连接(数据中的i的i[3]
但是,这可以在一行中完成:

ip_address, tags_descrip, regions_az, volume_id = (','.join(j[i] for j in data) for i in range(4))
另一种可能是:(这里您只对
数据
迭代一次,但它不是那么可读)

下面是第二种方法的工作原理(我认为第一种方法是不言自明的):

将以下元组传递给
zip

IP, ... from the first tuple
IP, ... from the second tuple
   .
   .
   .
因此,所有不同的字段都是对齐的
zip
提供了一个迭代器,它返回包含每个列表第一项的元组,然后返回包含第二项的元组,依此类推。因此,如果您调用
list(zip(*data))
,您将有一个包含for条目的列表:所有IP,等等

我会选择第一个选项而不是第二个选项,因为第一个选项更具可读性,但是如果您真的关心性能(但我想您不会在本例中使用Python),那么第二个选项就是最好的选择

我希望我能帮上忙


CodenameLambda

带有
[[j[0]表示j in i]表示i in数据]
您正在查看列表,并计算
[j[0]表示j in i]
,其中
i
是当前元组。因此,您遍历元组,
j
是当前字符串,您得到该字符串的第一个字符

然而,您想要的只是元组的第一项。这意味着您甚至不需要
itertools.chain
:使用
[i[0]for i in data]
进行操作。这将获取每个元组的第一个元素,并生成预期的输出

下面是更改后的代码:

ip_address=','.join(i[0]表示数据中的i)#您可以在此处使用迭代器
标记_descripp=',join(i[1]表示数据中的i)
区域_az=','。连接(i[2]表示数据中的i)
卷_id=','。连接(数据中的i的i[3]
但是,这可以在一行中完成:

ip_address, tags_descrip, regions_az, volume_id = (','.join(j[i] for j in data) for i in range(4))
另一种可能是:(这里您只对
数据
迭代一次,但它不是那么可读)

下面是第二种方法的工作原理(我认为第一种方法是不言自明的):

将以下元组传递给
zip

IP, ... from the first tuple
IP, ... from the second tuple
   .
   .
   .
因此,所有不同的字段都是对齐的
zip
提供了一个迭代器,它返回包含每个列表第一项的元组,然后返回包含第二项的元组,依此类推。因此,如果您调用
list(zip(*data))
,您将有一个包含for条目的列表:所有IP,等等

我会选择第一个选项而不是第二个选项,因为第一个选项更具可读性,但是如果您真的关心性能(但我想您不会在本例中使用Python),那么第二个选项就是最好的选择

我希望我能帮上忙


CodenameLambda

一旦你
,你的元组列表就会变平。这是你想要的行为吗?你到底想做什么?我想你想用
[I[0]表示数据中的I]
[I[1]表示数据中的I]
。。。就是这样。您当前正在遍历所有元组,并在其中选择每个字符串的第一个字符,然后将其传递给
itertools.chain
,这就是意外行为的原因。@MosesKoledoye更新了代码,我正试图将这些值传递给快照创建者function@CodingLambdas:em,你能看到我更新的代码吗。。如何根据您的建议更新我的代码?此外,我还在我的
\uuuu main\uuuu
中创建了
,一旦你
,你的元组列表就会变平。这是你想要的行为吗?你到底想做什么?我想你想用
[I[0]表示数据中的I]
[I[1]表示数据中的I]
。。。就是这样。您当前正在遍历所有元组,并在其中选择每个字符串的第一个字符,然后将其传递给
itertools.chain
,这就是意外行为的原因。@MosesKoledoye更新了代码,我正试图将这些值传递给快照创建者function@CodingLambdas:em,你能看到我更新的代码吗。。如何根据您的建议更新我的代码?我还在我的
\uuuuu main\uuuuuuuuuuuuu
中创建了
,哦,好的。。所以我想我可以抛弃itertools,然后用这种方式,还有,你认为我能把这些值一个一个地传递给快照创建者函数吗?@Kittystone只要你的代码能够获取这些参数并将它们用于什么目的,它就应该可以工作
IP, ... from the first tuple
IP, ... from the second tuple
   .
   .
   .