首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python中的迭代工具实现不同长度列表的乘积

使用Python中的迭代工具实现不同长度列表的乘积
EN

Stack Overflow用户
提问于 2022-01-20 22:22:06
回答 2查看 257关注 0票数 1

我有以下清单:

代码语言:javascript
复制
sectors = ["A", "B"]

rows = [['1', '2', '3'], ['1', '2', '3', '4']]

seats = [['ab', 'abcd', 'ab'], ['ab', 'abcd', 'ab', 'abcd']]

我想创造像A1a, A1b, A2a, A2b, A2c ...这样的产品

这段代码

代码语言:javascript
复制
  combinations = []
  for i in range(len(rows)):
    c = list(zip_longest(repeat(sectors[i], len(rows[i])), rows[i], seats[i]))
    combinations += c

  for c in combinations:
    for x in product(*c):
       print("".join(x))

A1a A1b A2a A2b A2c A2d A3a ...格式打印所需的结果

能否以一种更好、更易读的方式解决这个问题,我正在练习itertools,这对我来说有点混乱。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-20 23:43:27

不确定这是你想要的,还是它更优雅:

代码语言:javascript
复制
from itertools import chain, product

combinations = product(
    sectors,
    chain.from_iterable(chain.from_iterable(rows)),
    chain.from_iterable(chain.from_iterable(seats)),
)
joined_combinations = map(lambda t: "".join(t), combinations)
list(joined_combinations)
# returns
['A1a', 'A1b', 'A1a', 'A1b', 'A1c', 'A1d', 'A1a', ...]

说明:应用两次chain.from_iterable,您可以从嵌套列表中“解压”单个字符,然后创建非嵌套列表的项的产品(这将创建3个元组),最后将每个三元组的项连接在一起。

如果您想避免重复,可以在set()中的每个参数周围放置一个product

票数 1
EN

Stack Overflow用户

发布于 2022-01-21 00:20:17

由于您是从3个嵌套列表(而不是笛卡尔乘积)创建三元组,我认为更直观的做法是对相应的子列表进行zip并使用循环。

代码语言:javascript
复制
out = [sector + row + s for sector, rws, sts in zip(sectors, rows, seats) 
       for row, seat in zip(rws, sts) for s in seat] 

如果我们想使用itertools.product,首先在sectors中重复元素来匹配其他列表的子列表的长度,而不是像上面的最内循环那样手动创建产品元素,我们迭代产品本身。当然,这很像你自己的方法。

代码语言:javascript
复制
repsectors = [repeat(sector, len(rows[i])) for i, sector in enumerate(sectors)]
out = [''.join(x) for tpl1 in zip(repsectors, rows, seats) 
       for tpl2 in zip(*tpl1) for x in itertools.product(*tpl2)]

输出:

代码语言:javascript
复制
['A1a', 'A1b', 'A2a', 'A2b', 'A2c', 'A2d', 'A3a', 'A3b', 'B1a', 'B1b', 'B2a', 'B2b', 'B2c', 'B2d', 'B3a', 'B3b', 'B4a', 'B4b', 'B4c', 'B4d']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70794140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档