繁体   English   中英

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

[英]Need unique nested list from nested list

我有以下嵌套列表:

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

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

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

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

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

我的新 output 列表是[['Ban', 'App'], ['Gra', 'Ora'], ['Man', 'Blu']] 最后一个元素是['Pin', 'App']并且由于“App”在['Ban', 'App']中,即使“Pin”是一个新项目,我们也不考虑这个项目。

我的最终 output 应该是[['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

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

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']]

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

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])

此代码通过迭代sample并检查其中每个sublist中的任何项目是否在集合中来工作。 如果是,那么我们将忽略该项目并继续。 否则,将sublist列表添加到过滤列表并将项目添加到集合中。 此代码的运行速度将比您拥有的代码快得多(O(n) vs. O(n^2))。

此代码没有考虑的一件事是,您的子列表中有一项已被查看,而另一项未被查看。 您可能需要修改代码来处理这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM