我有以下清单:
sectors = ["A", "B"]
rows = [['1', '2', '3'], ['1', '2', '3', '4']]
seats = [['ab', 'abcd', 'ab'], ['ab', 'abcd', 'ab', 'abcd']]我想创造像A1a, A1b, A2a, A2b, A2c ...这样的产品
这段代码
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,这对我来说有点混乱。
发布于 2022-01-20 23:43:27
不确定这是你想要的,还是它更优雅:
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。
发布于 2022-01-21 00:20:17
由于您是从3个嵌套列表(而不是笛卡尔乘积)创建三元组,我认为更直观的做法是对相应的子列表进行zip并使用循环。
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中重复元素来匹配其他列表的子列表的长度,而不是像上面的最内循环那样手动创建产品元素,我们迭代产品本身。当然,这很像你自己的方法。
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)]输出:
['A1a', 'A1b', 'A2a', 'A2b', 'A2c', 'A2d', 'A3a', 'A3b', 'B1a', 'B1b', 'B2a', 'B2b', 'B2c', 'B2d', 'B3a', 'B3b', 'B4a', 'B4b', 'B4c', 'B4d']https://stackoverflow.com/questions/70794140
复制相似问题