如何从 python 中的嵌套列表中删除列表?
How to remove a list from a nested list in python?
我正在使用 python 探索概率,我想解决这类问题。我有 5 对夫妇,我想从这些夫妇中提取每组三人,其中不包含已婚夫妇。
import itertools as it
married_couples = [["Mary","John"],["Homer","Marge"],["Beauty","Beast"],["Abigail","George"],["Marco","Luisa"]]
all_persons = []
for couples in married_couples:
for person in couples:
all_persons.append(person)
sample_space = list(it.combinations(all_persons,3))
# Better solution with generator:
sample_space = [s for t in it.combinations(married_couples, 3) for s in it.product(*t)]
现在我想继续从样本 space 中排除所有包含来自同一对已婚夫妇的人的结果,我尝试:
correct_results = sample_space.copy()
for couple in married_couples:
for res in sample_space:
if couple[0] in res and couple[1] in res:
if res in correct_results:
correct_results.remove(res)
编辑:我编辑了生成器解决方案并将其放入其中,因此您可以为此目的使用此代码
问题在
if couple[0] and couple[1] in res:
因为它测试的不是这对夫妇在 res
中,而是这对夫妇的第一个元素不为 null 而第二个元素在 res
.
中
你应该使用:
if couple[0] in res and couple[1] in res:
这里有一个更有效的方法:
r = [s for t in itertools.combinations(married_couples, 3) for s in itertools.product(*t)]
如果您只需要对此进行迭代,而不需要将其作为实际的扩展列表,那么您可以创建一个生成器:
iter = (s for t in itertools.combinations(married_couples, 3) for s in itertools.product(*t))
那么你可以这样做:
for triple in iter:
...
两种解决方案的工作原理如下:它有两个级别。在顶层,它调用 itertools.combinations(married_couples, 3)
。这会从原始的已婚夫妇中生成所有三胞胎。然后,对于每个三元组,它使用 iterrools.product(*t)
生成所有 8 种组合,这些组合从三元组中的每对中取一个。
我正在使用 python 探索概率,我想解决这类问题。我有 5 对夫妇,我想从这些夫妇中提取每组三人,其中不包含已婚夫妇。
import itertools as it
married_couples = [["Mary","John"],["Homer","Marge"],["Beauty","Beast"],["Abigail","George"],["Marco","Luisa"]]
all_persons = []
for couples in married_couples:
for person in couples:
all_persons.append(person)
sample_space = list(it.combinations(all_persons,3))
# Better solution with generator:
sample_space = [s for t in it.combinations(married_couples, 3) for s in it.product(*t)]
现在我想继续从样本 space 中排除所有包含来自同一对已婚夫妇的人的结果,我尝试:
correct_results = sample_space.copy()
for couple in married_couples:
for res in sample_space:
if couple[0] in res and couple[1] in res:
if res in correct_results:
correct_results.remove(res)
编辑:我编辑了生成器解决方案并将其放入其中,因此您可以为此目的使用此代码
问题在
if couple[0] and couple[1] in res:
因为它测试的不是这对夫妇在 res
中,而是这对夫妇的第一个元素不为 null 而第二个元素在 res
.
你应该使用:
if couple[0] in res and couple[1] in res:
这里有一个更有效的方法:
r = [s for t in itertools.combinations(married_couples, 3) for s in itertools.product(*t)]
如果您只需要对此进行迭代,而不需要将其作为实际的扩展列表,那么您可以创建一个生成器:
iter = (s for t in itertools.combinations(married_couples, 3) for s in itertools.product(*t))
那么你可以这样做:
for triple in iter:
...
两种解决方案的工作原理如下:它有两个级别。在顶层,它调用 itertools.combinations(married_couples, 3)
。这会从原始的已婚夫妇中生成所有三胞胎。然后,对于每个三元组,它使用 iterrools.product(*t)
生成所有 8 种组合,这些组合从三元组中的每对中取一个。