提问人:Sriya TR 提问时间:1/12/2023 最后编辑:Woody1193Sriya TR 更新时间:1/12/2023 访问量:152
需要嵌套列表中的唯一嵌套列表
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
例如,我的输出列表需要包含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
答:
我会保留一个跟踪已经看到的项目的集合,并且只有在与该集合没有交集的情况下才将该对添加到最终列表中。
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']]
评论
intersection
您应该使用集合来保存您已经查看过的值。然后,您可以遍历每个子列表中的每个项目,并检查它们是否在集合中:
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))。sample
sublist
sublist
此代码未考虑的一件事是,您的子列表有一个项目已查看,而另一个项目未显示。您可能需要对代码进行修改才能处理这种情况。
评论