合并两个列表并在给定列表 2 的情况下输出列表 1 的所有可能组合
Posted
技术标签:
【中文标题】合并两个列表并在给定列表 2 的情况下输出列表 1 的所有可能组合【英文标题】:Combine two list and output all possible combinations of list 1 given list 2 【发布时间】:2019-11-01 01:24:44 【问题描述】:我在 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 做一些事情,但我无法解决它。任何建议将不胜感激。
【问题讨论】:
输出不明确,因为它不是一个有效的列表,括号不平衡。请更正。 我不认为这是重复的,或者至少不是链接问题的重复。虽然此处需要使用相同的函数 (itertools.product
),但此处所需的输出不同(列表列表的列表!),这意味着需要使用 product
的不同参数而不是其他问题。
谢谢 Blckknight 我同意你的评价。感谢您实际阅读内容并与我合作。您下面的解决方案是最简洁的。
【参考方案1】:
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
【讨论】:
很高兴我能帮上忙。很高兴回答您可能遇到的问题。请点赞 嗨,ChristSent。我正在尝试投票,但我认为我还是太新了。【参考方案2】:您的列表理解力几乎完成了。您只需要使用product
而不是permutations
,因为您想从list2
重复相同的值。试试这个:
output = [list(zip(list1, x)) for x in itertools.product(list2, repeat=len(list1))]
这将创建一个 2 元组列表的列表。如果你也需要最里面的元素是列表,你可以使用list(map(list, zip(...)))
。
【讨论】:
Blckknght 你是对的!感谢您的反馈意见。我投了赞成票,但这是我将使用的解决方案。【参考方案3】:我认为这会起作用
import itertools
list1=['A','B']
list2 = [True, False]
output=[]
for a,b in itertools.product(list1,list2):
temp=[]
temp.append(a)
temp.append(b)
output.append(temp)
print(output)
它基本上是用 list2 置换 list1 中的所有内容
【讨论】:
以上是关于合并两个列表并在给定列表 2 的情况下输出列表 1 的所有可能组合的主要内容,如果未能解决你的问题,请参考以下文章
合并两个具有列表的数据集并在合并后使用 pandas 保留列表