簡體   English   中英

如何從兩個字符串列表的笛卡爾積創建列表

[英]How to create lists from a cartesian product of two string lists

我有兩個看起來像這樣的字符串列表:

print(objects_list)
print(verb_list)

他們 output:

['parking_meter', 'sink', 'teddy_bear']
 
 ['sail', 'fill', 'fly', 'greet', 'hit', 'hose', 'hunt', 'install',
 'kick', 'launch', 'move', 'pick', 'repair', 'sit_at', 'squeeze',
 'stab', 'straddle', 'talk_on']

我希望這兩個列表的產品格式如下:

[['parking_meter','sail'],['parking_meter','fill'],['parking_meter','fly']......]

我試過這段代碼

list3 = [[str(l),str(n)] for l in objects_list for n in verb_list]
print(list3)

但它輸出:

[['[', '['], ['[', "'"], ['[', 's'], ['[', 'a'], ['[', 'i'], ['[',
 'l'], ['[', "'"], ['[', ','], ['[', ' '], ['[', "'"], ['[', 'f'],
 ['[', 'i'], ['[', 'l'], ['[', 'l'], ['[', "'"], ['[', ','], ['[', '
 '], ['[', "'"], ['[', 'f'], ['[', 'l'], ['[', 'y'], [.....

任何解決方案?

您的代碼應該按原樣工作。 我懷疑您的實際代碼中有一些其他不必要的 str() function 調用:

objects_list = ['parking_meter', 'sink', 'teddy_bear']
verb_list = ['sail', 'fill', 'fly', 'greet', 'hit', 'hose',
             'hunt', 'install', 'kick', 'launch', 'move', 
             'pick', 'repair', 'sit_at', 'squeeze', 'stab', 
             'straddle', 'talk_on']

list3 = [[o,v] for o in objects_list for v in verb_list]

[['parking_meter', 'sail'], ['parking_meter', 'fill'], ['parking_meter', 'fly'], ['parking_meter', 'greet'], ['parking_meter', 'hit'], ['parking_meter', 'hose'], ['parking_meter', 'hunt'], ['parking_meter', 'install'], ['parking_meter', 'kick'], ['parking_meter', 'launch'], ['parking_meter', 'move'], ['parking_meter', 'pick'], ['parking_meter', 'repair'], ['parking_meter', 'sit_at'], ['parking_meter', 'squeeze'], ['parking_meter', 'stab'], ['parking_meter', 'straddle'], ['parking_meter', 'talk_on'], ['sink', 'sail'], ['sink', 'fill'], ['sink', 'fly'], ['sink', 'greet'], ['sink', 'hit'], ['sink', 'hose'], ['sink', 'hunt'], ['sink', 'install'], ['sink', 'kick'], ['sink', 'launch'], ['sink', 'move'], ['sink', 'pick'], ['sink', 'repair'], ['sink', 'sit_at'], ['sink', 'squeeze'], ['sink', 'stab'], ['sink', 'straddle'], ['sink', 'talk_on'], ['teddy_bear', 'sail'], ['teddy_bear', 'fill'], ['teddy_bear', 'fly'], ['teddy_bear', 'greet'], ['teddy_bear', 'hit'], ['teddy_bear', 'hose'], ['teddy_bear', 'hunt'], ['teddy_bear', 'install'], ['teddy_bear', 'kick'], ['teddy_bear', 'launch'], ['teddy_bear', 'move'], ['teddy_bear', 'pick'], ['teddy_bear', 'repair'], ['teddy_bear', 'sit_at'], ['teddy_bear', 'squeeze'], ['teddy_bear', 'stab'], ['teddy_bear', 'straddle'], ['teddy_bear', 'talk_on']]

試試這個,使用 itertools 庫。 有一個名為 product 的 function 可以為您提供笛卡爾積。

import itertools

x = ['parking_meter', 'sink', 'teddy_bear']

y = ['sail', 'fill', 'fly', 'greet', 'hit', 'hose', 'hunt', 'install', 'kick', 'launch', 'move', 'pick', 'repair', 'sit_at', 'squeeze', 'stab', 'straddle', 'talk_on']

然后你可以做這個 2-liner,(因為產品 function 返回一個元組但你需要一個列表)

z = list(itertools.product(x,y))
z = [list(z) for z in z]

或者這個 1-liner,

z = [list(tup) for tup in list(itertools.product(x, y))]

然后我,

print (z)

這給了我

[['parking_meter', 'sail'],
 ['parking_meter', 'fill'],
 ['parking_meter', 'fly'],
 ['parking_meter', 'greet'],
 ['parking_meter', 'hit'],
 ['parking_meter', 'hose'],
 ['parking_meter', 'hunt'],
 ['parking_meter', 'install'],
 ['parking_meter', 'kick'],
 ['parking_meter', 'launch'],
 ['parking_meter', 'move'],
 ['parking_meter', 'pick'],
 ['parking_meter', 'repair'],
 ['parking_meter', 'sit_at'],
 ['parking_meter', 'squeeze'],
 ['parking_meter', 'stab'],
 ['parking_meter', 'straddle'],
 ['parking_meter', 'talk_on'],
 ['sink', 'sail'],
 ['sink', 'fill'],
 ['sink', 'fly'],......

從您得到的 output 看來,您的輸入列表是字符串,而不是列表。

好像objects_listprint(objects_list)的 output ,而不是列表本身。

因此,當迭代objects_list時,不是迭代列表項,而是迭代其字符串表示的字符:

"["
"'"
"p"
"a"
...

您的代碼在其他方面是正確的,除非您不需要在列表理解中將元素轉換為字符串。

list3 = [[l, n] for l in objects_list for n in verb_list]

你的代碼工作得很好,給了我預期的 output。 我不確定是否還有其他問題。 可能是您的列表沒有像我一樣聲明...如果您是從其他來源創建此列表...您應該檢查格式。

注意:我已在 Python 3.9.5 上運行此代碼

objects_list = ['parking_meter', 'sink', 'teddy_bear']
verb_list = ['sail', 'fill', 'fly', 'greet', 'hit', 'hose', 'hunt', 'install', 'kick', 'launch', 'move', 'pick', 'repair', 'sit_at', 'squeeze', 'stab', 'straddle', 'talk_on'] 

list3 = [[str(l),str(n)] for l in objects_list for n in verb_list] 
print(list3)

Output:
[['parking_meter', 'sail'], ['parking_meter', 'fill'], ['parking_meter', 'fly']['parking_meter', 'greet'], ['parking_meter', 'hit'], ['parking_meter', 'hose'], ['parking_meter', 'hunt'], ['parking_meter', 'install'], ['parking_meter', 'kick'], ['parking_meter', 'launch'], ['parking_meter', 'move'], ['parking_meter', 'pick'], ['parking_meter', 'repair'], ['parking_meter', 'sit_at'], ['parking_meter', 'squeeze'], ['parking_meter', 'stab'], ['parking_meter', 'straddle'], ['parking_meter', 'talk_on'], ['sink', 'sail'], ['sink', 'fill'], ['sink', 'fly'], ['sink', 'greet'], ['sink', 'hit'], ['sink', 'hose'], ['sink', 'hunt'], ['sink', 'install'], ['sink', 'kick'], ['sink', 'launch'], ['sink', 'move'], ['sink', 'pick'], ['sink', 'repair'], ['sink', 'sit_at'], ['sink', 'squeeze'], ['sink', 'stab'], ['sink', 'straddle'], ['sink', 'talk_on'], ['teddy_bear', 'sail'], ['teddy_bear', 'fill'], ['teddy_bear', 'fly'], ['teddy_bear', 'greet'], ['teddy_bear', 'hit'], ['teddy_bear', 'hose'], ['teddy_bear', 'hunt'], ['teddy_bear', 'install'], ['teddy_bear', 'kick'], ['teddy_bear', 'launch'], ['teddy_bear', 'move'], ['teddy_bear', 'pick'], ['teddy_bear', 'repair'], ['teddy_bear', 'sit_at'], ['teddy_bear', 'squeeze'], ['teddy_bear', 'stab'], ['teddy_bear', 'straddle'], ['teddy_bear', 'talk_on']]

暫無
暫無

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

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