簡體   English   中英

如何使用itertools將返回的值從一個函數傳遞給另一個函數?

[英]How to use itertools to pass the returned values from one function to another?

我有一個列表被返回為

[('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>

現在,我將其傳遞給另一種方法,在該方法中,我需要提取每個值並將其單獨存儲,因此我使用了來自__main__ itertools

data = list(itertools.chain(*ansible_box_info))
print "-----------------"
print data
#mapping = {i[0]: [i[1], i[2]] for i in data}
print "Now Calling the Snapshot Creater!"
call_snapshot_creater(data)

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]))

這打破了上面的列表,只選擇了所有內容的首字母,即ip_address打印:

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

使用[[j[0] for j in i] for i in data]您將遍歷該列表,並計算[j[0] for j in i] ,其中i是當前元組。 因此,您遍歷元組,其中j是當前字符串,並獲得該字符串的第一個字符。

但是,您想要的只是元組的第一項。 這意味着您甚至不需要itertools.chain :使用[i[0] for i in data] 這將獲取每個元組的第一個元素,並產生預期的輸出。

因此,這是更改后的代碼:

ip_address = ','.join(i[0] for i in data)  # you can use an iterator here
tags_descrip = ','.join(i[1] for i in data)
regions_az = ','.join(i[2] for i in data)
volume_id = ','.join(i[3] for i in data)

但是,這可以全部一行完成:

ip_address, tags_descrip, regions_az, volume_id = (','.join(j[i] for j in data) for i in range(4))

另一個可能性如下:(這里您僅對data一次迭代,但是可讀性不強)

ip_address, tags_descrip, regions_az, volume_id = map(','.join, zip(*data))

這是第二個方法的工作原理(我認為第一個是不言而喻的):

您將以下元組傳遞給zip

IP, ... from the first tuple
IP, ... from the second tuple
   .
   .
   .

因此,所有不同的字段都是對齊的。 zip為您提供了一個迭代器,該迭代器返回包含每個列表的第一項的元組,然后返回包含第二項的元組,依此類推。 因此,如果您要調用list(zip(*data)) ,則將具有一個用於輸入的列表:所有IP,依此類推。

我會選擇第一個選項而不是第二個選項,因為第一個選項更具可讀性,但是如果您確實關心性能(我想在這種情況下您不會使用Python),那么第二個選項是要走的路。

我希望我能幫上忙,

代號Lambda

您沒有使用chain並正確拆箱 您嘗試做的所有事情都可以通過zip 和解 zip viz完成。 zip(*...)

>>> l = [('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')]
>>>
>>> data = zip(*l)
>>>
>>> ip_address = ','.join(next(data))
>>> ip_address
'10.12.250.29,10.12.32.22,10.12.0.20,10.12.250.7,10.12.250.4,10.12.32.16,10.121.15.22,10.17.15.145'
>>>
>>> tags_descrip = ','.join(next(data))
>>> tags_descrip
'pdx02-he-trial-ansible01,pdx02-cloud-prod-ansible01 Clone ,pdx02-cloud-trial/dev-ansible01,pdx02-he-prod-ansible01,pdx02-he-dev-ansible01,pdx02-cloud-prod-ansible,ansible-classic,pdx01-ms-dev-ansible'
>>>
>>> regions_az = ','.join(next(data))
>>> regions_az
'us-west-2a,us-west-2b,us-west-2a,us-west-2a,us-west-2a,us-west-2b,us-west-2a,us-west-2a'
>>>
>>> volume_id = ','.join(next(data))
>>> volume_id
'vol-e7775a10,vol-b0607d70,vol-b32e5c46,vol-fd94400b,vol-ee6abf18,vol-ae49adbb,vol-f893c20d,vol-e2d45515'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM