代码之家  ›  专栏  ›  技术社区  ›  Jane Sully

如何输出字典值的排列[重复]

  •  0
  • Jane Sully  · 技术社区  · 5 年前

    这个问题已经有了答案:

    我有一个带n个键的dict,其中n至少是10。对于每个键n,它的值是一个元素列表,该列表的大小是可变的。我想能够产生所有的排列。所以输出将是所有唯一的n长度序列(对于n个键)。我将举一个简单的例子来说明这个目标。所以想象一下 {'key1': ['a', 'b'], 'key2': ['1', '2'], 'key3' :['*', '!']} . 所以输出是(保持键的原始顺序-[key1,key2,key3]:

    ['a', '1', '*']
    ['a', '1', '!']
    ['a', '2', '*']
    ['a', '2', '!']
    ['b', '1', '*']
    ['b', '1', '!']
    ['b', '2', '*']
    ['b', '2', '!']
    

    同样,在我的例子中,键的数量和每个值的长度都要大得多,但这只是为了说明目标。如果能帮上忙,我会很感激的,因为通常我使用for循环,但是计算大量可变的for循环是不可行的。谢谢!

    1 回复  |  直到 5 年前
        1
  •  1
  •   Tom Karzes    5 年前

    试试这个:

    import itertools
    
    d = {'key1': ['a', 'b'], 'key2': ['1', '2'], 'key3' :['*', '!']}
    iter = itertools.product(*d.values())
    

    这给了你一个迭代器。如果要将其展开为列表,请使用:

    list(iter)
    

    产生:

    [('a', '1', '*'),
     ('a', '1', '!'),
     ('a', '2', '*'),
     ('a', '2', '!'),
     ('b', '1', '*'),
     ('b', '1', '!'),
     ('b', '2', '*'),
     ('b', '2', '!')]
    

    注意,每个条目都是元组,这可能适合您的需要,但如果需要,它们可以很容易地转换为列表。