簡體   English   中英

python中的嵌套循環產生笛卡爾積

[英]Nested loop in python to produce cartesian product

我試圖在python中遍歷兩個列表以獲取這樣的輸出。

list1 = [a, b, c]
list2 = [1, 2, 3]

因此,它應該為列表2上list1的每個值循環。list1 [a]將在list2上循環3次,依此類推,直到達到c。 但是,我沒有得到所需的輸出。

i=''
list1 = ['ABC ' + str(i)+ ' '+'1' + ' ' + '5', 'CDE '+ str(i)+ ' '+  '1'+ ' ' + '5']
list2=['123','234','456']
for c in list1:
         for i in list2:
               print c

輸出:

ABC  1 5
ABC  1 5
ABC  1 5
CDE  1 5
CDE  1 5
CDE  1 5

所需的輸出格式如下:

ABC 123 1 5
CDE 123 1 5
ABC 234 1 5
CDE 234 1 5
ABC 456 1 5
CDE 456 1 5

請指導我在這里我所缺少的,這是新的。

您需要在循環內插list2值。 您可以使用itertools.product()函數,而不是嵌套循環。 如果要更改list1的值,請交換列表的順序:

from itertools import product

list1 = ['ABC {} 1 5', 'CDE {} 1 5']
list2 = ['123','234','456']
for l2, l1 in product(list2, list1):
    print l1.format(l2)

str.format()方法l2值填充list1字符串中的{} ,從而避免每次都從頭開始重建list2

>>> for l2, l1 in product(list2, list1):
...     print(l1.format(l2))
...
ABC 123 1 5
CDE 123 1 5
ABC 234 1 5
CDE 234 1 5
ABC 456 1 5
CDE 456 1 5

另一種選擇是讓list1包含要使用的值的元組 ,並且僅在打印時才通過使用print()作為函數將所有內容轉換為一個字符串(Python 3或Python 2中的from __future__ import):

from __future__ import print_function

list1 = [('ABC', 1, 5), ('CDE', 1, 5)]
list2 = ['123','234','456']
for l2, (a, b, c) in product(list2, list1):
    print(a, l2, b, c)

這取決於您還想對產生的值做些什么。

請注意,如果list1的值之間的15數字不變,則根本不需要使用字符串模板或元組進行復雜的舞蹈。 您只需要在循環中引用這些內容即可:

b, c = 1, 5
list1 = ['ABC', 'CDE']
list2 = ['123','234','456']
for l2, l1 in product(list2, list1):
    print '{} {} {} {}'.format(l1, l2, b, c)

我仍然使用字符串格式化只是為了展示將多個值組合到一個字符串中的另一種形式。

您需要將list1的構造移到for循環中。 重新組織行,如下所示:

list2 = ['123', '234', '456']

for i in list2:
    list1 = ['ABC ' + str(i) + ' ' + '1' + ' ' + '5',
             'CDE ' + str(i) + ' ' + '1' + ' ' + '5']
    for c in list1:
        print c

這將打印

ABC 123 1 5
CDE 123 1 5
ABC 234 1 5
CDE 234 1 5
ABC 456 1 5
CDE 456 1 5

話雖這么說,可以使用字符串格式化來改進:

for i in list2:
    list1 = ['ABC {0} 1 5', 'CDE {0} 1 5']
    for c in list1:
        print c.format(i)

暫無
暫無

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

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