python - 组合两个列表并在给定列表 2 的情况下输出列表 1 的所有可能组合
问题描述
我在 python 中有两个列表。
list1 = ['A', 'B']
list2 = [True, False]
list1 在现实世界中已被简化,它将超过 2 个元素。清单 2 只会是真或假。
我想生成以下输出,给定 list1 中的 2 个元素:
output=[
[['A', True], ['B', True]],
[['A', False], ['B', True]],
[['A', True], ['B', False]],
[['A', False], ['B', False]]]
我希望算法能够支持 list1 中包含 2 个以上元素的场景。
以下是 list1 中包含 3 个元素的示例:
list1 = ['A', 'B', 'C']
list2 = [True, False]
output=[
[['A', True], ['B', True], ['C', True]],
[['A', True], ['B', True], ['C', False]],
[['A', True], ['B', False], ['C', True]],
[['A', False], ['B', True], ['C', True]],
[['A', False, ['B', False], ['C', True]],
[['A', True], ['B', False, ['C', False]],
[['A', False], ['B', True], ['C', False]],
[['A', False], ['B', False], ['C', False]]
]
以下让我接近但不完全在那里。
[zip(x, list2) for x in it.permutations(list1, len(list2))]
我知道我需要使用 itertools 做一些事情,但无法绕开它。任何建议将不胜感激。
解决方案
from pprint import pprint
import itertools
list1 = ['A', 'B']
list2 = [True, False]
newdict = {}
final_list = []
for element in itertools.product(list1,list2):
if element[0] not in newdict.keys():
newdict[element[0]] = []
newdict[element[0]].append(list(element))
values = (list(newdict.values()))
for x in itertools.product('01', repeat=len(values)):
tmp_list = []
for i,index in enumerate(list(x)):
tmp_list.append(values[int(i)][int(index)])
final_list.append(tmp_list)
pprint (final_list)
输出:
[[['A', True], ['B', True]],
[['A', True], ['B', False]],
[['A', False], ['B', True]],
[['A', False], ['B', False]]]
A、B、C 的输出:
[[['A', True], ['B', True], ['C', True]],
[['A', True], ['B', True], ['C', False]],
[['A', True], ['B', False], ['C', True]],
[['A', True], ['B', False], ['C', False]],
[['A', False], ['B', True], ['C', True]],
[['A', False], ['B', True], ['C', False]],
[['A', False], ['B', False], ['C', True]],
[['A', False], ['B', False], ['C', False]]]
最初我采用笛卡尔积,但我将每个键(A、B 或 C)分隔到自己的列表中。这会产生:
[[['A', True], ['A', False]],
[['B', True], ['B', False]],
[['C', True], ['C', False]]]
从那里我们只是以二进制计数以索引到这些列表中。例如
000 = A,True B,True C,True
001 = A,True B,True C,False
...
111 = A,False B,False C,False
推荐阅读
- android - 如何在 ListView 中的最后一项之后添加按钮 + 纯文本?
- r - 数据框列表的 lapply 和聚合列 R
- c++ - 使用自定义宏来简化诸如 cin 和 cout 语句之类的事情是更好还是更糟?
- firebase - 为什么 Yahoo 拒绝 Firebase 的 OAuth 回调域(重定向端点)?
- java - 从另一个类 java 访问 int[] 的问题
- java - Lucene索引:查询时得到空结果
- javascript - 当涉及到文本以创建一系列变化的文本时,在 setAttribute() 上的 JavaScript 中设置属性时,我应该放什么?
- swift - 如何在 Instruments 中调试 Realm 内存泄漏
- python - telnetlib的expect方法的贪心量词问题
- xamarin.forms - Xamarin Form 4 外壳