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

乔尔·威尔森

注意:这不是重复的问题,因为标题可能会说

如果我有一个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个长度的子列表时,给出的合并数约为4亿。

  2. 订单很重要,因此sorted无法解决我的问题。这可能会使某些人感到困惑,因此在下面的示例中进行说明。

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

在这里,我有2个独特的群组:

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

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

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

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

因此位置1固定为1

希望这个例子有帮助。

抽烟

编辑答案:

根据新信息,为了处理过多的组合超载itertools.product(),我们可以尝试小批量提取列表:

from itertools import product
l = [list(range(3))]*18
prods = product(*l)
uniques = set()
results = []
totals = 0

def run_batch(n=1000000):
    for i in range(n):
        try:
            result = next(prods)
        except StopIteration:
            break
        unique = tuple(sorted(result))
        if unique not in uniques:
            uniques.add(unique)
            results.append(result)
    global totals
    totals += i

run_batch()
print('Total iteration this batch: {0}'.format(totals))
print('Number of unique tuples: {0}'.format(len(uniques)))
print('Number of wanted combos: {0}'.format(len(results)))

输出:

Total iteration this batch: 999999
Number of unique tuples: 103
Number of wanted combos: 103
First 10 results:
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2)

在这里,我们可以通过调用next(prod)您选择的范围来控制批量大小,并根据需要继续操作。uniques集合中已排序元组作为参考点,并且将results它们按所需的正确顺序排列。当我用3 ^ 18的列表运行时,两个大小应该相同,并且令人惊讶地小。我对内存分配不是很熟悉,但是这种方式程序不应该将所有不需要的结果存储在内存中,因此您应该有更多的摆动空间。否则,您始终可以选择将导出results到文件以腾出空间。显然,此示例仅显示列表的长度,但是您可以根据自己的目的轻松显示/保存该列表。

我不能说这是最好的方法或最优化的方法,但是它似乎对我有用。也许对您有用吗?该批次大约需要10秒钟才能运行5次(平均每批次2秒钟)。整个过程prods花了我15分钟才能运行:

Total iteration: 387420102
Number of unique tuples: 190
Number of wanted combos: 190

原始答案:

@RoadRunner使用sort()提供了一个简洁的解决方案defaultdict,但我觉得不需要后者。我利用了他的sort()建议,并在此处实施了修改版本。

这个答案

l = [[1] ,[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]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从python中的列表列表中获取唯一组合值

从python列表中获取元素的唯一组合

Python:从附加到单个列表的三个单独列表中获取唯一组合?

从python中的元组列表中保留唯一组合

Python:将所有具有约束的唯一组合输出到Pandas DataFrame

如何获取出现在python pandas数据框中的两列的唯一组合的数量

从排列列表中获取所有唯一组合

如何在从另一个列表压缩具有大量排列的列表以获得唯一组合时避免 Python 中的内存错误?

从列表列表中获取所有唯一组合,直到第 n 个组合

Libre Office 中的值列表中给定长度的所有唯一组合

用python中所有可能配对的列表替换一组整数上的嵌套for循环

如何在python中获取大小为k的列表的所有组合(其中k>列表的长度)?

c#如何获取对象列表及其频率的所有唯一组合

如何获取列的唯一组合并在python数据框中按它们排序?

在python中查找两个字符串的唯一组合

在Python中获取列表的所有组合

Python中一组列表的所有可能排列

如何获取一组python的所有子集

JavaScript,从多个数组中获取所有唯一组合

Python Pandas:为2个类别变量的唯一组合创建变量吗?

如何在Python中获取大小为k的列表元素的所有组合(如果列表,则为k>长度)?

共识/群集在Python中的一组可变长度列表?

从两个字符串中获取所有唯一组合 c#

根据Python数据框中的条件创建具有所有唯一可能组合的列表

从数组获取给定数量的元素的所有唯一组合

Python re.sub 替换所有内容而不是一组

Python:如何获取仅出现在一组列表中的一组中的项目?

计算列表R中的唯一组合

获取具有ID /值的唯一组合的对象列表