需要嵌套列表中的唯一嵌套列表

Need unique nested list from nested list

提问人:Sriya TR 提问时间:1/12/2023 最后编辑:Woody1193Sriya TR 更新时间:1/12/2023 访问量:152

问:

我有以下嵌套列表:

sample = [['Ban', 'App'], ['Ban', 'Ora'], ['Gra', 'App'], ['Gra', 'Ora'], ['Kiw','App'], ['Kiw', 'Ora'], ['Man', 'Blu'], ['Pin', 'App']]

我需要考虑嵌套列表的每个子列表中未出现在任何其他子列表中的项目。sample

例如,我的输出列表需要包含nested_list的第一个元素。我需要将 ['Ban', 'App'] 与列表的其余部分进行比较。由于元素 2 中的“Ban”和元素 3 中的“App”存在于 中,因此我们不考虑它们。我的下一个输出元素将是,因为这些项目不在 .['Ban', 'App']['Gra', 'Ora']['Ban', 'App']

现在我的输出是,我必须将嵌套列表的其余部分与这两个元素进行比较。我的下一个元素是 和 。由于 'App' 在 中,而 'Ora' 在 中,因此这不会出现在输出列表中。[['Ban', 'App'], ['Gra', 'Ora']]['Kiw','App']['Kiw', 'Ora']['Ban', 'App']['Gra', 'Ora']

我的输出列表仍然是 .我的下一个元素是,这些是全新的项目,这将添加到我的输出列表中。[['Ban', 'App'], ['Gra', 'Ora']]['Man', 'Blu']

我的新输出列表是 。最后一个元素是,因为“App”在 中,即使“Pin”是新项目,我们也不会考虑此项目。[['Ban', 'App'], ['Gra', 'Ora'], ['Man', 'Blu']]['Pin', 'App']['Ban', 'App']

我的最终输出应该是 .[['Ban', 'App'], ['Gra', 'Ora'], ['Man', 'Blu']]

final_output = [['Ban', 'App'], ['Gra', 'Ora'], ['Man', 'Blu']]

我从下面的代码开始,但这并不能完全满足我的需要:

j =0
for i in range(len(sample)):
    #print ("I:", str(i))
    #print ("J" ,str(j))
    i = j
    for j in range(1, len(sample)):
        if sample[i][0] == sample[j][0] or sample[i][0] == sample[j][1] or sample[i][1] == sample[j][0] or sample[i][1] == sample[j][1]:
            pass
        else:
            print (sample[i], sample[j])
            #print (j)
            i = j
            break
python python-3.x 列表 循环嵌 套列表

评论

0赞 Karl Knechtel 1/12/2023
需要明确的是:每次我们查看其中一个内部列表时,我们都想检查它是否包含之前在任何先前输出中提到的任何字符串

答:

6赞 cottontail 1/12/2023 #1

我会保留一个跟踪已经看到的项目的集合,并且只有在与该集合没有交集的情况下才将该对添加到最终列表中。

st = set()
final_output = []
for pair in sample:
    if not st.intersection(pair):
        final_output.append(pair)
        st.update(pair)

print(final_output)
# [['Ban', 'App'], ['Gra', 'Ora'], ['Man', 'Blu']]

评论

0赞 Woody1193 1/12/2023
我明白我们也有同样的想法。我喜欢你对 .intersection
0赞 cottontail 1/12/2023
@Woody1193我也喜欢你的解决方案。解释非常好
2赞 Woody1193 1/12/2023 #2

您应该使用集合来保存您已经查看过的值。然后,您可以遍历每个子列表中的每个项目,并检查它们是否在集合中:

seen = set()
filtered = []
for sublist in sample:
    if sublist[0] in seen or sublist[1] in seen:
        continue

    filtered.append(sublist)
    seen.add(sublist[0])
    seen.add(sublist[1])

此代码的工作原理是遍历并检查其中每个项目中是否有任何项目在集合中。如果是,那么我们将忽略该项目并继续。否则,请添加到筛选列表中,然后将项目添加到集合中。此代码的运行速度将比您拥有的代码快得多(O(n) vs. O(n^2))。samplesublistsublist

此代码未考虑的一件事是,您的子列表有一个项目已查看,而另一个项目未显示。您可能需要对代码进行修改才能处理这种情况。