【问题标题】:Python create list combinationPython创建列表组合
【发布时间】:2016-09-07 16:16:45
【问题描述】:

我有一本包含元素和元素序列计数的字典。我想创建一个由这些元素组合而成的列表列表

例子

Input: dictElement = {"PA":2,"PB":2}

Expected Output:
[('PB0', 'PA0'),
('PB0', 'PA1'),
('PB1', 'PA0'),
('PB1', 'PA1')]

Input: dictElement = {"PA":2,"PB":2,"PC":3}

Expected Output:
[('PC0', 'PB0', 'PA0'), 
('PC0', 'PB0', 'PA1'), 
('PC0', 'PB1', 'PA0'), 
('PC0', 'PB1', 'PA1'), 
('PC1', 'PB0', 'PA0'), 
('PC1', 'PB0', 'PA1'), 
('PC1', 'PB1', 'PA0'), 
('PC1', 'PB1', 'PA1'), 
('PC2', 'PB0', 'PA0'), 
('PC2', 'PB0', 'PA1'), 
('PC2', 'PB1', 'PA0'), 
('PC2', 'PB1', 'PA1')]

注意:字典的元素个数可以改变

【问题讨论】:

  • 你做了什么
  • 字典是无序的。您想对键强加什么“顺序”?
  • 除此之外,这可以通过itertools.product() 轻松实现; product(*(['{}{}'.format(v, i) for i in range(dictElement[v])] for v in dictElement)).
  • 对不起,我想保持顺序作为例子
  • @KenNguyen:是什么决定了这个顺序。您无法从字典中获取该顺序,因为该顺序无法保证,并且会随着插入、删除以及是否启用哈希随机化(默认情况下在 Python 3 上)在当前随机哈希值上发生细微变化。

标签: python combinations


【解决方案1】:

您尚未指定在输出中应按什么顺序处理字典的键。如果假设反向排序,您可以使用itertools.product() 轻松做到这一点:

from itertools import product

combinations = product(*(['{0}{1}'.format(v, i) for i in range(dictElement[v])] 
                         for v in sorted(dictElement, reverse=True))

演示:

>>> from itertools import product
>>> dictElement = {"PA":2,"PB":2,"PC":3}
>>> combinations = product(*(['{0}{1}'.format(v, i) for i in range(dictElement[v])]
...                           for v in sorted(dictElement, reverse=True)))
>>> for combo in combinations:
...     print(combo)
...
('PC0', 'PB0', 'PA0')
('PC0', 'PB0', 'PA1')
('PC0', 'PB1', 'PA0')
('PC0', 'PB1', 'PA1')
('PC1', 'PB0', 'PA0')
('PC1', 'PB0', 'PA1')
('PC1', 'PB1', 'PA0')
('PC1', 'PB1', 'PA1')
('PC2', 'PB0', 'PA0')
('PC2', 'PB0', 'PA1')
('PC2', 'PB1', 'PA0')
('PC2', 'PB1', 'PA1')

【讨论】:

  • 我遇到了错误:ValueError: zero length field name in format
  • @KenNguyen:这意味着您使用的是 Python 2.6;在格式化占位符中使用01'{0}{1}'
  • combinations is 我们可以将其转换为列表列表吗?
  • @KenNguyen 只需在迭代器上调用 list()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多