gpt4 book ai didi

Python-从长度不等的列表列表中获取所有唯一组合并进行替换

转载 作者:太空宇宙 更新时间:2023-11-03 12:22:58 24 4
gpt4 key购买 nike

注意:这不是标题可能说的重复问题

如果我有一个 list 列表,我需要从中获取所有组合并进行替换。

import itertools

l = [[1,2,3] ,[1,2,3], [1,2,3]]
n = []
for i in itertools.product(*l):
if sorted(i) not in n:
n.append(sorted(i))
for i in n:
print(i)

[1, 1, 1]
[1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 2, 3]
[1, 3, 3]
[2, 2, 2]
[2, 2, 3]
[2, 3, 3]
[3, 3, 3]

感谢@RoadRunner 和@Idlehands。

上面的代码很完美,但有两个问题:

  1. 对于大型列表,itertools.product 会抛出 MemoryError。当 l 有 18 个 3-length 子列表给出 ~400mil combn 时。

  2. 顺序很重要,因此 sorted 无法解决我的问题。这可能会让一些人感到困惑,因此用下面的例子来解释。

    l = [[1,2,3], [1], [1,2,3]]

这里我有 2 个独特的组:

Group1 : 具有相同值 [1,2,3] 的元素 0、2

第 2 组:值为 [1] 的元素 1

因此,我需要的解决方案是:

[1,1,1]
[1,1,2]
[1,1,3]
[2,1,2]
[2,1,3]
[3,1,3]

因此位置 1 被固定为 1

希望这个例子对您有所帮助。

最佳答案

如何使用 collections.defaultdict 以不同顺序对具有相同元素的序列进行分组呢? ,然后从每个键中选取第一个元素:

from itertools import product
from collections import defaultdict

l = [[1] ,[1,2,3], [1,2,3]]

d = defaultdict(list)
for x in product(*l):
d[tuple(sorted(x))].append(x)

print([x[0] for x in d.values()])

给出:

[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 2), (1, 2, 3), (1, 3, 3)]

或者,这也可以通过保留一组已添加的内容来完成:

from itertools import product

l = [[1] ,[1,2,3], [1,2,3]]

seen = set()
combs = []

for x in product(*l):
curr = tuple(sorted(x))
if curr not in seen:
combs.append(x)
seen.add(curr)

print(combs)
# [(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 2), (1, 2, 3), (1, 3, 3)]

如果您不想排序,请考虑使用 frozensetcollections.Counter() :

from collections import Counter
from itertools import product

l = [[1] ,[1,2,3], [1,2,3]]

seen = set()
combs = []

for x in product(*l):
curr = frozenset(Counter(x).items())

if curr not in seen:
seen.add(curr)
combs.append(x)

print(combs)
# [(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 2), (1, 2, 3), (1, 3, 3)]

注意: 如果您不想使用 defaultdict(),您也可以使用 setdefault() 作为第一种方法.

关于Python-从长度不等的列表列表中获取所有唯一组合并进行替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48375270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com