【发布时间】:2021-11-24 10:35:35
【问题描述】:
我有一个 Python dict,其中包含不同长度的列表作为键值。
{
'basis1': ['key11', 'key12', 'key13', 'key14'],
'basis2': ['key21'],
'basis3': ['key31', 'key32', 'key33'],
'basis4': ['key41', 'key42'],
...'basisX': ['keyX1', ..., 'keyXX']
}
如何获得所有 dict 键值的所有可能组合(每个键的一个值与另一个键的一个值)?我的意思不仅是“基础1 +基础2 + ...基础X”值,还有例如“basis2 + basis1 + basic3”和“basis3 + basicX”值。
我曾经使用“itertools”中的“产品”函数进行迭代,以通过预定公式生成关键字。但是由于公式和这些公式中的列表数量存在限制。但是我需要使它不依赖于将被馈送到函数输入的列表的数量,以及以不同的顺序混合列表中的值。
from itertools import product
...
...
...
# Each [keysX] is a list of values
formula1 = [keys0] + [keys1]
formula2 = [keys0] + [keys2]
formula3 = [keys1] + [keys2]
formula4 = [keys0] + [keys1] + [keys2]
all_keywords = []
for combo in product(*formula1):
all_keywords.append(" ".join(combo))
for combo in product(*formula2):
all_keywords.append(" ".join(combo))
for combo in product(*formula3):
all_keywords.append(" ".join(combo))
for combo in product(*formula4):
all_keywords.append(" ".join(combo))
【问题讨论】:
-
对于这样的问题,我很难理解。也许输入和预期输出部分会帮助我和其他人更好地理解它。
-
你可能想看看
powersets。转到itertools recipe,搜索powerset。 -
@SayanipDutta powerset 将返回 (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3),但没有(2, 1) 或 (3, 1, 2) 值
-
@kite 输出:key11 + key31 + keyXX keyXX + key21 key12 + key32 + key42 + keyX1 以此类推。我需要所有可能的值,但 itertools 产品不会打乱值顺序以创建唯一组合。另外,它会创建all-to-all组合或者我们需要为组合指定公式,这在大量列表的情况下会出现问题。
-
当然,在
powerset之后你需要permutate每个元素。
标签: python iteration itertools