【问题标题】:How to create lists from a cartesian product of two string lists如何从两个字符串列表的笛卡尔积创建列表
【发布时间】:2022-01-06 09:47:21
【问题描述】:

我有两个如下所示的字符串列表:

print(objects_list)
print(verb_list)

他们输出:

['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'], [.....

有什么办法吗?

【问题讨论】:

标签: python string list for-loop cartesian-product


【解决方案1】:

您的代码应该可以正常工作。我怀疑您的实际代码中还有其他一些不必要的 str() 函数调用:

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

【讨论】:

  • 但它仍然输出相同的结果。当我写for o in objects_list: print(o) 时,它在单独的行中分别给我每个字符。 [ ' p a r k i n g _ m e t e r ' , ' s i n k ' , '
  • 从输出看,在 OP 中重现代码之前,似乎有虚假的strobjects_list 本身是列表的字符串表示形式,而不是列表本身。 (见我的回答。)
  • 您的 objects_list 和 verb_list 变量可能是列表的字符串表示形式,而不是实际的 Python 列表。
  • 谢谢。让我检查一下这个问题
【解决方案2】:

试试这个,使用 itertools 库。有一个叫做 product 的函数可以得到一个笛卡尔积。

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,(因为 product 函数返回一个元组但你需要一个列表)

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'],......

【讨论】:

  • 我想要列表而不是元组
  • @RAFI 我已经编辑了我的代码
  • 使用 itertools 并不能解决最初的问题,这不是列表理解,而是初始列表实际上是字符串这一事实。
【解决方案3】:

从您得到的输出来看,您的输入列表似乎是字符串,而不是列表。

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

因此,当迭代objects_list 时,不是迭代列表项,而是迭代其字符串表示的字符:

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

您的代码在其他方面是正确的,除了您不需要在列表推导中将元素转换为字符串。

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

【讨论】:

  • 是的,我正面临这个问题,你知道了。有什么可能的解决方案
  • 好吧,它发生在代码的前面,所以除非您向我们展示如何设置这些列表,否则我们无法帮助您。
【解决方案4】:

您的代码运行良好,并给了我预期的输出。我不确定是否还有其他问题。可能是您的列表没有像我一样声明...如果您是从其他来源创建此列表...您应该检查格式。

注意:我已在 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']]

【讨论】:

    猜你喜欢
    • 2018-04-04
    • 2012-01-03
    • 2020-08-23
    • 2020-09-12
    • 2021-10-22
    • 1970-01-01
    • 2012-02-25
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多