如何从 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 种组合,这些组合从三元组中的每对中取一个。